From 8b656c579d4f720b0559d25e094417ec66da4e7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20No=C3=ABl-Romas?= Date: Wed, 20 Aug 2025 13:26:46 -0500 Subject: [PATCH 01/53] scaffolding --- packages/atxp-base/package.json | 41 ++++++ packages/atxp-base/src/baseAppAccount.ts | 0 .../atxp-base/src/baseAppPaymentMaker.test.ts | 62 ++++++++ packages/atxp-base/src/baseAppPaymentMaker.ts | 135 ++++++++++++++++++ packages/atxp-base/tsconfig.cjs.json | 8 ++ packages/atxp-base/tsconfig.json | 25 ++++ packages/atxp-base/vitest.config.ts | 9 ++ 7 files changed, 280 insertions(+) create mode 100644 packages/atxp-base/package.json create mode 100644 packages/atxp-base/src/baseAppAccount.ts create mode 100644 packages/atxp-base/src/baseAppPaymentMaker.test.ts create mode 100644 packages/atxp-base/src/baseAppPaymentMaker.ts create mode 100644 packages/atxp-base/tsconfig.cjs.json create mode 100644 packages/atxp-base/tsconfig.json create mode 100644 packages/atxp-base/vitest.config.ts diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json new file mode 100644 index 00000000..4abf41e3 --- /dev/null +++ b/packages/atxp-base/package.json @@ -0,0 +1,41 @@ +{ + "name": "@atxp/base", + "version": "0.2.10", + "description": "ATXP for Base Mini Apps", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/atxp-dev/sdk.git", + "directory": "packages/atxp-base" + }, + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "typecheck": "tsc --noEmit", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "test": "vitest run" + }, + "dependencies": { + "@atxp/common": "0.2.10", + "@atxp/client": "0.2.10" + }, + "devDependencies": { + "@types/node": "^22.13.0", + "@types/supertest": "^6.0.3", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^9.32.0", + "fetch-mock": "^12.5.2", + "happy-dom": "^15.11.6", + "jsdom": "^25.0.1", + "supertest": "^7.1.4", + "typescript": "^5.7.3", + "vitest": "^3.0.9" + } +} diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/atxp-base/src/baseAppPaymentMaker.test.ts b/packages/atxp-base/src/baseAppPaymentMaker.test.ts new file mode 100644 index 00000000..95f121b0 --- /dev/null +++ b/packages/atxp-base/src/baseAppPaymentMaker.test.ts @@ -0,0 +1,62 @@ +import { describe, it, expect } from 'vitest'; +import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; +import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; + +describe('basePaymentMaker.generateJWT', () => { + it('should generate a valid JWT with default payload', async () => { + const privateKey = generatePrivateKey(); + const account = privateKeyToAccount(privateKey); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', privateKey); + const jwt = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); + + // JWT format: header.payload.signature (all base64url) + const [headerB64, payloadB64, signatureB64] = jwt.split('.'); + expect(headerB64).toBeDefined(); + expect(payloadB64).toBeDefined(); + expect(signatureB64).toBeDefined(); + + // Decode header and payload + const decodeB64Url = (str: string) => { + // Pad string for base64 decoding + let b64 = str.replace(/-/g, '+').replace(/_/g, '/'); + while (b64.length % 4) b64 += '='; + return JSON.parse(Buffer.from(b64, 'base64').toString('utf-8')); + }; + const header = decodeB64Url(headerB64); + const payload = decodeB64Url(payloadB64); + + expect(header.alg).toBe('ES256K'); + expect(header.typ).toBeUndefined(); // BasePaymentMaker doesn't set typ + expect(payload.sub).toBe(account.address); + expect(payload.iss).toBe('accounts.atxp.ai'); + expect(payload.aud).toBe('https://auth.atxp.ai'); + expect(typeof payload.iat).toBe('number'); + expect(payload.paymentIds).toBeUndefined(); + + // Signature verification would require ES256K (secp256k1) verification + // which is different from the EdDSA verification used in SolanaPaymentMaker + // For now, we just verify the signature is present and properly formatted + expect(signatureB64).toBeDefined(); + expect(signatureB64.length).toBeGreaterThan(0); + + // Decode the signature to verify it's a hex string with 0x prefix + const decodedSig = Buffer.from(signatureB64, 'base64url').toString('utf8'); + expect(decodedSig).toMatch(/^0x[a-fA-F0-9]+$/); + }); + + it('should include payment request id if provided', async () => { + const privateKey = generatePrivateKey(); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', privateKey); + const paymentRequestId = 'id1'; + const jwt = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); + const [, payloadB64] = jwt.split('.'); + const decodeB64Url = (str: string) => { + let b64 = str.replace(/-/g, '+').replace(/_/g, '/'); + while (b64.length % 4) b64 += '='; + return JSON.parse(Buffer.from(b64, 'base64').toString('utf-8')); + }; + const payload = decodeB64Url(payloadB64); + expect(payload.payment_request_id).toEqual(paymentRequestId); + }); +}); + diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts new file mode 100644 index 00000000..4da50cbf --- /dev/null +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -0,0 +1,135 @@ +import type { PaymentMaker } from '@atxp/client'; +import { Logger } from '@atxp/common'; +import { ConsoleLogger } from '@atxp/common'; +import { privateKeyToAccount } from 'viem/accounts'; +import { createWalletClient, http, publicActions, encodeFunctionData, parseEther, Address } from 'viem'; +import { base } from 'viem/chains'; + +const USDC_CONTRACT_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet +const USDC_DECIMALS = 6; +const ERC20_ABI = [ + { + constant: false, + inputs: [ + { name: "_to", type: "address" }, + { name: "_value", type: "uint256" }, + ], + name: "transfer", + outputs: [{ name: "", type: "bool" }], + type: "function", + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } +]; + +export class BaseAppPaymentMaker implements PaymentMaker { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private signingClient: any; // Extended wallet client with public actions + private account: ReturnType; + private logger: Logger; + + constructor(baseRPCUrl: string, sourceSecretKey: `0x${string}`, logger?: Logger) { + if (!baseRPCUrl) { + throw new Error('Base RPC URL is required'); + } + if (!sourceSecretKey) { + throw new Error('Source secret key is required'); + } + + this.account = privateKeyToAccount(sourceSecretKey); + this.signingClient = createWalletClient({ + account: this.account, + chain: base, + transport: http(baseRPCUrl), + }).extend(publicActions); + this.logger = logger ?? new ConsoleLogger(); + } + + generateJWT = async({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise => { + const headerObj = { alg: 'ES256K' }; // this value is specific to Base + const payloadObj = { + sub: this.account.address, + iss: 'accounts.atxp.ai', + aud: 'https://auth.atxp.ai', + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 60 * 60, + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), + } as Record; + + const header = Buffer.from(JSON.stringify(headerObj)).toString('base64url'); + const payload = Buffer.from(JSON.stringify(payloadObj)).toString('base64url'); + const message = `${header}.${payload}`; + + // For Ethereum wallets, we need to use personal_sign format + const messageBytes = Buffer.from(message, 'utf8'); + const signResult = await this.signingClient.signMessage({ + account: this.account, + message: { raw: messageBytes }, + }); + + // The paymcp server expects ES256K signatures as hex strings with 0x prefix + // The signResult from viem is already in hex format with 0x prefix (65 bytes) + // We encode the hex string itself (including 0x) as base64url + const signature = Buffer.from(signResult, 'utf8').toString('base64url'); + + return `${header}.${payload}.${signature}`; + } + + makePayment = async (amount: BigNumber, currency: string, receiver: string): Promise => { + currency = currency.toLowerCase(); + if (currency !== 'usdc') { + throw new Error('Only usdc currency is supported; received ' + currency); + } + + this.logger.info(`Making payment of ${amount} ${currency} to ${receiver} on Base`); + + // Convert amount to USDC units (6 decimals) as BigInt + const amountInUSDCUnits = BigInt(amount.multipliedBy(10 ** USDC_DECIMALS).toFixed(0)); + + const data = encodeFunctionData({ + abi: ERC20_ABI, + functionName: "transfer", + args: [receiver as Address, amountInUSDCUnits], + }); + const hash = await this.signingClient.sendTransaction({ + chain: base, + account: this.account, + to: USDC_CONTRACT_ADDRESS, + data: data, + value: parseEther('0'), + }); + + // Wait for transaction confirmation with more blocks to ensure propagation + this.logger.info(`Waiting for transaction confirmation: ${hash}`); + const receipt = await this.signingClient.waitForTransactionReceipt({ + hash: hash as `0x${string}`, + confirmations: 3 // Wait for 3 confirmations to ensure better propagation + }); + + if (receipt.status === 'reverted') { + throw new Error(`Transaction reverted: ${hash}`); + } + + this.logger.info(`Transaction confirmed: ${hash} in block ${receipt.blockNumber}`); + + return hash; + } +} diff --git a/packages/atxp-base/tsconfig.cjs.json b/packages/atxp-base/tsconfig.cjs.json new file mode 100644 index 00000000..87f5a7b8 --- /dev/null +++ b/packages/atxp-base/tsconfig.cjs.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "CommonJS", + "moduleResolution": "node", + "outDir": "./dist-cjs" + } +} \ No newline at end of file diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json new file mode 100644 index 00000000..36aa2bd1 --- /dev/null +++ b/packages/atxp-base/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "node", + "lib": ["ES2020", "DOM"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "allowSyntheticDefaultImports": true, + "composite": true + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"], + "references": [ + { "path": "../atxp-common" } + ] +} \ No newline at end of file diff --git a/packages/atxp-base/vitest.config.ts b/packages/atxp-base/vitest.config.ts new file mode 100644 index 00000000..3a7d8292 --- /dev/null +++ b/packages/atxp-base/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'node', + globals: true, + setupFiles: ['./src/setup.expo.ts'], + }, +}); \ No newline at end of file From 3e8b6e78a69c0a3b20cb1768848fbb241f104d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20No=C3=ABl-Romas?= Date: Wed, 20 Aug 2025 15:35:38 -0500 Subject: [PATCH 02/53] flesh out --- package-lock.json | 289 ++++++++++++++++++ packages/atxp-base/README.md | 45 +++ packages/atxp-base/package.json | 4 +- packages/atxp-base/src/baseAppAccount.ts | 85 ++++++ .../atxp-base/src/baseAppPaymentMaker.test.ts | 20 +- packages/atxp-base/src/baseAppPaymentMaker.ts | 145 +++------ packages/atxp-base/src/types.ts | 36 +++ packages/atxp-base/tsconfig.json | 2 +- packages/atxp-client/src/basePaymentMaker.ts | 7 +- 9 files changed, 522 insertions(+), 111 deletions(-) create mode 100644 packages/atxp-base/README.md create mode 100644 packages/atxp-base/src/types.ts diff --git a/package-lock.json b/package-lock.json index 52f5f44c..48a56578 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,6 +87,10 @@ "dev": true, "license": "ISC" }, + "node_modules/@atxp/base": { + "resolved": "packages/atxp-base", + "link": true + }, "node_modules/@atxp/client": { "resolved": "packages/atxp-client", "link": true @@ -1804,6 +1808,75 @@ "node": ">=6.9.0" } }, + "node_modules/@base-org/account": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.0.2.tgz", + "integrity": "sha512-p/mefIVfiKxDYWIoZSp1VeCXmh3hqmaD8ThS7YKMnuxljfM6dOJTxvUpZ/emkXvQQa1nnCA+TRVZt1nCrs5ACA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "1.4.0", + "clsx": "1.2.1", + "eventemitter3": "5.0.1", + "idb-keyval": "6.2.1", + "ox": "0.6.9", + "preact": "10.24.2", + "viem": "^2.31.7", + "zustand": "5.0.3" + } + }, + "node_modules/@base-org/account/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@base-org/account/node_modules/ox": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@base-org/account/node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -6841,6 +6914,15 @@ "node": ">=0.8" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -7211,6 +7293,32 @@ "node": ">=18" } }, +<<<<<<< HEAD +======= + "node_modules/data-urls/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, +>>>>>>> c8ea810 (flesh out) "node_modules/data-urls/node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", @@ -7221,6 +7329,23 @@ "node": ">=18" } }, +<<<<<<< HEAD +======= + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, +>>>>>>> c8ea810 (flesh out) "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -9520,6 +9645,7 @@ "node": ">= 0.8" } }, +<<<<<<< HEAD "node_modules/http-errors/node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -9538,6 +9664,8 @@ "node": ">= 0.8" } }, +======= +>>>>>>> c8ea810 (flesh out) "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -9586,6 +9714,12 @@ "node": ">=0.10.0" } }, + "node_modules/idb-keyval": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", + "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", + "license": "Apache-2.0" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -10639,6 +10773,32 @@ } } }, +<<<<<<< HEAD +======= + "node_modules/jsdom/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, +>>>>>>> c8ea810 (flesh out) "node_modules/jsdom/node_modules/whatwg-mimetype": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", @@ -10649,6 +10809,45 @@ "node": ">=18" } }, +<<<<<<< HEAD +======= + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, +>>>>>>> c8ea810 (flesh out) "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -12713,6 +12912,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/preact": { + "version": "10.24.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", + "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -15921,6 +16130,19 @@ "node": ">=18" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -16478,6 +16700,59 @@ "zod": "^3.24.1" } }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "packages/atxp-base": { + "name": "@atxp/base", + "version": "0.2.10", + "license": "MIT", + "dependencies": { + "@atxp/client": "0.2.10", + "@atxp/common": "0.2.10", + "@base-org/account": "^2.0.2", + "viem": "^2.34.0" + }, + "devDependencies": { + "@types/node": "^22.13.0", + "@types/supertest": "^6.0.3", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "eslint": "^9.32.0", + "fetch-mock": "^12.5.2", + "happy-dom": "^15.11.6", + "jsdom": "^25.0.1", + "supertest": "^7.1.4", + "typescript": "^5.7.3", + "vitest": "^3.0.9" + } + }, "packages/atxp-client": { "name": "@atxp/client", "version": "0.2.13", @@ -16510,6 +16785,7 @@ "expo-crypto": ">=14.0.0" } }, +<<<<<<< HEAD "packages/atxp-client/node_modules/base-x": { "version": "5.0.1", "license": "MIT" @@ -16521,6 +16797,8 @@ "base-x": "^5.0.0" } }, +======= +>>>>>>> c8ea810 (flesh out) "packages/atxp-common": { "name": "@atxp/common", "version": "0.2.13", @@ -16542,9 +16820,18 @@ "vitest": "^3.0.9" } }, +<<<<<<< HEAD "packages/atxp-redis": { "name": "@atxp/redis", "version": "0.2.13", +======= +<<<<<<< HEAD + "packages/atxp-common/node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, +>>>>>>> c8ea810 (flesh out) "license": "MIT", "dependencies": { "@atxp/common": "0.2.13", @@ -16559,6 +16846,8 @@ "vitest": "^3.0.9" } }, +======= +>>>>>>> 7e29fd6 (flesh out) "packages/atxp-server": { "name": "@atxp/server", "version": "0.2.13", diff --git a/packages/atxp-base/README.md b/packages/atxp-base/README.md new file mode 100644 index 00000000..7572356d --- /dev/null +++ b/packages/atxp-base/README.md @@ -0,0 +1,45 @@ +# @atxp/base + +For use within [Base Mini Apps](https://docs.base.org/mini-apps/overview) + +## Example + +``` +// Import the ATXP client SDK +import { atxpClient } from '@atxp/client'; +import { BaseAppAccount } from '@atxp/base'; +import { getCryptoKeyAccount } from "@base-org/account"; + +// (rate limited, use a different node in production) +const BASE_RPC_URL = 'https://mainnet.base.org'; + +// IMPORTANT: +// all of the following code requires the user to +// have connected their Base wallet to the app + +const account = await getCryptoKeyAccount(); +const userWalletAddress = account.account?.address +if (!userWalletAddress) { + throw new Error("No user wallet address found—please ensure that the user's wallet is connected"); +} + +// this will prompt the user for a spend permission if +// none is found in local storage +const baseAppAccount = await BaseAppAccount.initialize + BASE_RPC_URL, + userWalletAddress, + // optional config + { + appName: 'My Mini App', // displayed to the user when requesting spend permission + allowance: 10n, // requesting 10 USDC for each period + periodInDays: 7, // periods renew every 7 days + } +); + +// Now you can create an ATXP client which +// pulls funds from the user's wallet as needed +const client = await atxpClient({ + mcpServer: browseService.mcpServer, + account: baseAppAccount, +}); +``` \ No newline at end of file diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index 4abf41e3..80f7cc87 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -22,8 +22,10 @@ "test": "vitest run" }, "dependencies": { + "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", - "@atxp/client": "0.2.10" + "@base-org/account": "^2.0.2", + "viem": "^2.34.0" }, "devDependencies": { "@types/node": "^22.13.0", diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index e69de29b..f7035ae2 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -0,0 +1,85 @@ +import type { Account, PaymentMaker } from '@atxp/client'; +import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; +import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; +import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; +import { createBaseAccountSDK } from "@base-org/account"; +import { requestSpendPermission } from "@base-org/account/spend-permission"; +import { base } from 'viem/chains'; +import { SpendPermission } from './types.js'; + +const DEFAULT_ALLOWANCE = 10n; +const DEFAULT_PERIOD_IN_DAYS = 7; + +export class BaseAppAccount implements Account { + accountId: string; + paymentMakers: { [key: string]: PaymentMaker }; + + static async initialize(baseRPCUrl: string, userWalletAddress: string, config?: { + appName: string; + allowance?: bigint; + periodInDays?: number; + }): Promise { + // if we have a stored permission, use it to construct account + const storageKey = `atxp-base-permission-${userWalletAddress}`; + const storedPermission = localStorage.getItem(storageKey); + if (storedPermission) { + const permission = JSON.parse(storedPermission); + return new BaseAppAccount(baseRPCUrl, permission.permission, permission.privateKey); + } + + // otherwise, prompt user for spend permission and then construct account + const sdk = createBaseAccountSDK({ + appName: config?.appName, + appChainIds: [base.id], + }); + const provider = sdk.getProvider(); + + // this is an "ephemeral" wallet that only ever lives client-side + // BaseAppPayementMaker uses it to pull funds from the user's wallet + // and pass them along to the MCP server + const privateKey = generatePrivateKey(); + const spender = privateKeyToAccount(privateKey); + + // request spend permission from the user + const permission = await requestSpendPermission({ + account: userWalletAddress, + spender: spender.address, + token: USDC_CONTRACT_ADDRESS_BASE, + chainId: base.id, + allowance: config?.allowance ?? DEFAULT_ALLOWANCE, + periodInDays: config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS, + provider, + }); + + // store the permission in local storage + localStorage.setItem(storageKey, JSON.stringify({ + privateKey, + permission, + })); + + // construct account with the permission + return new BaseAppAccount(baseRPCUrl, permission, privateKey); + } + + constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`) { + if (!baseRPCUrl) { + throw new Error('Base RPC URL is required'); + } + if (!privateKey) { + throw new Error('Private key (for ephemeral wallet) is required'); + } + if (!spendPermission) { + throw new Error('Spend permission is required'); + } + + const account = privateKeyToAccount(privateKey); + + // this is setting the accountId to the address of the *ephemeral* wallet, + // not the user's wallet address. that seems like the least surprising + // thing to do, but it might still cause some confusion... + this.accountId = account.address; + this.paymentMakers = { + 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey), + } + } +} \ No newline at end of file diff --git a/packages/atxp-base/src/baseAppPaymentMaker.test.ts b/packages/atxp-base/src/baseAppPaymentMaker.test.ts index 95f121b0..39d53aa0 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.test.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.test.ts @@ -1,12 +1,28 @@ import { describe, it, expect } from 'vitest'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; +import { SpendPermission } from './types.js'; + +const FAKE_PERMISSION: SpendPermission = { + signature: '0x123', + permission: { + account: '0x123', + spender: '0x123', + token: '0x123', + allowance: 10n.toString(), + period: 7, + start: 1000000000000000000, + end: 1000000000000000000, + salt: '0', + extraData: '0x123', + } +}; describe('basePaymentMaker.generateJWT', () => { it('should generate a valid JWT with default payload', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', privateKey); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey); const jwt = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); // JWT format: header.payload.signature (all base64url) @@ -46,7 +62,7 @@ describe('basePaymentMaker.generateJWT', () => { it('should include payment request id if provided', async () => { const privateKey = generatePrivateKey(); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', privateKey); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey); const paymentRequestId = 'id1'; const jwt = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); const [, payloadB64] = jwt.split('.'); diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 4da50cbf..b1757aaa 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,135 +1,68 @@ -import type { PaymentMaker } from '@atxp/client'; +import { BasePaymentMaker } from '@atxp/client'; import { Logger } from '@atxp/common'; -import { ConsoleLogger } from '@atxp/common'; +import { prepareSpendCallData } from "@base-org/account/spend-permission"; +import { parseEther, WalletClient, createWalletClient, http, publicActions, PublicClient} from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; -import { createWalletClient, http, publicActions, encodeFunctionData, parseEther, Address } from 'viem'; import { base } from 'viem/chains'; +import { SpendPermission } from './types.js'; -const USDC_CONTRACT_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet -const USDC_DECIMALS = 6; -const ERC20_ABI = [ - { - constant: false, - inputs: [ - { name: "_to", type: "address" }, - { name: "_value", type: "uint256" }, - ], - name: "transfer", - outputs: [{ name: "", type: "bool" }], - type: "function", - }, - { - "constant": true, - "inputs": [ - { - "name": "_owner", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "name": "balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } -]; - -export class BaseAppPaymentMaker implements PaymentMaker { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private signingClient: any; // Extended wallet client with public actions - private account: ReturnType; - private logger: Logger; +export class BaseAppPaymentMaker extends BasePaymentMaker { + private spendPermission: SpendPermission; + private walletClient: WalletClient; - constructor(baseRPCUrl: string, sourceSecretKey: `0x${string}`, logger?: Logger) { - if (!baseRPCUrl) { - throw new Error('Base RPC URL is required'); - } - if (!sourceSecretKey) { - throw new Error('Source secret key is required'); + constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, logger?: Logger) { + if (!spendPermission) { + throw new Error('Spend permission is required'); } - - this.account = privateKeyToAccount(sourceSecretKey); - this.signingClient = createWalletClient({ - account: this.account, + super(baseRPCUrl, privateKey, logger); + this.spendPermission = spendPermission; + this.walletClient = createWalletClient({ + account: privateKeyToAccount(privateKey), chain: base, transport: http(baseRPCUrl), }).extend(publicActions); - this.logger = logger ?? new ConsoleLogger(); - } - - generateJWT = async({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise => { - const headerObj = { alg: 'ES256K' }; // this value is specific to Base - const payloadObj = { - sub: this.account.address, - iss: 'accounts.atxp.ai', - aud: 'https://auth.atxp.ai', - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 60 * 60, - ...(codeChallenge ? { code_challenge: codeChallenge } : {}), - ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), - } as Record; - - const header = Buffer.from(JSON.stringify(headerObj)).toString('base64url'); - const payload = Buffer.from(JSON.stringify(payloadObj)).toString('base64url'); - const message = `${header}.${payload}`; - - // For Ethereum wallets, we need to use personal_sign format - const messageBytes = Buffer.from(message, 'utf8'); - const signResult = await this.signingClient.signMessage({ - account: this.account, - message: { raw: messageBytes }, - }); - - // The paymcp server expects ES256K signatures as hex strings with 0x prefix - // The signResult from viem is already in hex format with 0x prefix (65 bytes) - // We encode the hex string itself (including 0x) as base64url - const signature = Buffer.from(signResult, 'utf8').toString('base64url'); - - return `${header}.${payload}.${signature}`; } + // override makePayment to use spend permissions makePayment = async (amount: BigNumber, currency: string, receiver: string): Promise => { currency = currency.toLowerCase(); if (currency !== 'usdc') { throw new Error('Only usdc currency is supported; received ' + currency); } - this.logger.info(`Making payment of ${amount} ${currency} to ${receiver} on Base`); + this._getLogger().info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); - // Convert amount to USDC units (6 decimals) as BigInt - const amountInUSDCUnits = BigInt(amount.multipliedBy(10 ** USDC_DECIMALS).toFixed(0)); - - const data = encodeFunctionData({ - abi: ERC20_ABI, - functionName: "transfer", - args: [receiver as Address, amountInUSDCUnits], - }); - const hash = await this.signingClient.sendTransaction({ - chain: base, - account: this.account, - to: USDC_CONTRACT_ADDRESS, - data: data, - value: parseEther('0'), - }); + const spendCalls = await prepareSpendCallData(this.spendPermission, BigInt(amount.toString())); + + let hash: `0x${string}` | undefined; + spendCalls.forEach(async (call) => + hash = await this.walletClient.sendTransaction({ + chain: base, + to: call.to, + data: call.data, + value: parseEther('0'), + account: this.spendPermission.permission.account as `0x${string}`, + }) + ); + + if (!hash) { + throw new Error('No hash returned from spendPermission sendTransaction'); + } // Wait for transaction confirmation with more blocks to ensure propagation - this.logger.info(`Waiting for transaction confirmation: ${hash}`); - const receipt = await this.signingClient.waitForTransactionReceipt({ + this._getLogger().info(`Waiting for spendPermission transaction confirmation: ${hash}`); + const receipt = await (this.walletClient as unknown as PublicClient).waitForTransactionReceipt({ hash: hash as `0x${string}`, confirmations: 3 // Wait for 3 confirmations to ensure better propagation }); if (receipt.status === 'reverted') { - throw new Error(`Transaction reverted: ${hash}`); + throw new Error(`spendPermission transaction reverted: ${hash}`); } - this.logger.info(`Transaction confirmed: ${hash} in block ${receipt.blockNumber}`); - - return hash; + this._getLogger().info(`spendPermission transaction confirmed: ${hash} in block ${receipt.blockNumber}`); + + // ok, now the ephemeral wallet has control of the funds, and we need to make the normal payment from here + return await super.makePayment(amount, currency, receiver); } } diff --git a/packages/atxp-base/src/types.ts b/packages/atxp-base/src/types.ts new file mode 100644 index 00000000..4f5f6e1c --- /dev/null +++ b/packages/atxp-base/src/types.ts @@ -0,0 +1,36 @@ +// source: https://github.com/base/account-sdk/blob/master/packages/account-sdk/src/core/rpc/coinbase_fetchSpendPermissions.ts + +/** + * Represents a spending permission with limits + */ +export type SpendPermission = { + /** UTC timestamp for when the permission was granted */ + createdAt?: number; + /** Hash of the permission in hex format */ + permissionHash?: string; + /** Cryptographic signature in hex format */ + signature: string; + /** Chain ID */ + chainId?: number; + /** The permission details */ + permission: { + /** Wallet address of the account */ + account: string; + /** Address of the contract/entity allowed to spend */ + spender: string; + /** Address of the token being spent */ + token: string; + /** Maximum amount allowed as base 10 numeric string */ + allowance: string; + /** Time period in seconds */ + period: number; + /** Start time in unix seconds */ + start: number; + /** Expiration time in unix seconds */ + end: number; + /** Salt as base 10 numeric string */ + salt: string; + /** Additional data in hex format */ + extraData: string; + }; +}; \ No newline at end of file diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index 36aa2bd1..241b1675 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2020", "module": "ESNext", - "moduleResolution": "node", + "moduleResolution": "bundler", "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 1dcb118d..e741795a 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -19,7 +19,7 @@ import { BigNumber } from "bignumber.js"; // Type for the extended wallet client with public actions type ExtendedWalletClient = WalletClient & PublicActions; -const USDC_CONTRACT_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet +export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; const ERC20_ABI = [ { @@ -74,6 +74,11 @@ export class BasePaymentMaker implements PaymentMaker { }).extend(publicActions) as ExtendedWalletClient; this.logger = logger ?? new ConsoleLogger(); } + + // expose the logger for subclasses to use + _getLogger = () => { + return this.logger; + } generateJWT = async({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise => { const headerObj = { alg: 'ES256K' }; // this value is specific to Base From 3ba139385fd399e848a6549d9f0c3750e76c4f5e Mon Sep 17 00:00:00 2001 From: bdj Date: Wed, 20 Aug 2025 14:46:07 -0700 Subject: [PATCH 03/53] Revert base payment maker class changes --- packages/atxp-client/src/basePaymentMaker.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index e741795a..612d0cd1 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -75,11 +75,6 @@ export class BasePaymentMaker implements PaymentMaker { this.logger = logger ?? new ConsoleLogger(); } - // expose the logger for subclasses to use - _getLogger = () => { - return this.logger; - } - generateJWT = async({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise => { const headerObj = { alg: 'ES256K' }; // this value is specific to Base const payloadObj = { From d30674bce77f2be695408550ab2ff1780e1d5f32 Mon Sep 17 00:00:00 2001 From: bdj Date: Wed, 20 Aug 2025 15:19:41 -0700 Subject: [PATCH 04/53] Cleanup, cleaner inheritence, npm install, storage abstraction, rebase --- package-lock.json | 1 + packages/atxp-base/README.md | 22 +++- packages/atxp-base/package.json | 1 + packages/atxp-base/src/baseAppAccount.ts | 37 ++++-- packages/atxp-base/src/baseAppPaymentMaker.ts | 41 ++++--- packages/atxp-base/src/index.ts | 10 ++ packages/atxp-base/src/storage.ts | 106 ++++++++++++++++++ packages/atxp-base/vitest.config.ts | 1 - packages/atxp-client/src/basePaymentMaker.ts | 11 +- 9 files changed, 200 insertions(+), 30 deletions(-) create mode 100644 packages/atxp-base/src/index.ts create mode 100644 packages/atxp-base/src/storage.ts diff --git a/package-lock.json b/package-lock.json index 48a56578..5575044c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16737,6 +16737,7 @@ "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "@base-org/account": "^2.0.2", + "bignumber.js": "^9.3.0", "viem": "^2.34.0" }, "devDependencies": { diff --git a/packages/atxp-base/README.md b/packages/atxp-base/README.md index 7572356d..f700fb21 100644 --- a/packages/atxp-base/README.md +++ b/packages/atxp-base/README.md @@ -25,7 +25,7 @@ if (!userWalletAddress) { // this will prompt the user for a spend permission if // none is found in local storage -const baseAppAccount = await BaseAppAccount.initialize +const baseAppAccount = await BaseAppAccount.initialize( BASE_RPC_URL, userWalletAddress, // optional config @@ -33,6 +33,7 @@ const baseAppAccount = await BaseAppAccount.initialize appName: 'My Mini App', // displayed to the user when requesting spend permission allowance: 10n, // requesting 10 USDC for each period periodInDays: 7, // periods renew every 7 days + // storage: customStorage, // optional: provide custom storage implementation (defaults to localStorage) } ); @@ -42,4 +43,23 @@ const client = await atxpClient({ mcpServer: browseService.mcpServer, account: baseAppAccount, }); +``` + +## Testing + +For unit tests, you can use the `MemoryStorage` implementation to avoid dependencies on browser APIs: + +```typescript +import { BaseAppAccount } from '@atxp/base'; +import { MemoryStorage } from '@atxp/base'; + +const testStorage = new MemoryStorage(); +const baseAppAccount = await BaseAppAccount.initialize( + BASE_RPC_URL, + userWalletAddress, + { + appName: 'Test App', + storage: testStorage, // Use in-memory storage for tests + } +); ``` \ No newline at end of file diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index 80f7cc87..a038aaff 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -25,6 +25,7 @@ "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "@base-org/account": "^2.0.2", + "bignumber.js": "^9.3.0", "viem": "^2.34.0" }, "devDependencies": { diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index f7035ae2..015c8cf3 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -6,6 +6,7 @@ import { createBaseAccountSDK } from "@base-org/account"; import { requestSpendPermission } from "@base-org/account/spend-permission"; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; +import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; const DEFAULT_ALLOWANCE = 10n; const DEFAULT_PERIOD_IN_DAYS = 7; @@ -18,13 +19,33 @@ export class BaseAppAccount implements Account { appName: string; allowance?: bigint; periodInDays?: number; + storage?: IStorage; }): Promise { - // if we have a stored permission, use it to construct account + // Initialize storage with type-safe wrapper + const baseStorage = config?.storage || new BrowserStorage(); + const permissionStorage = new PermissionStorage(baseStorage); const storageKey = `atxp-base-permission-${userWalletAddress}`; - const storedPermission = localStorage.getItem(storageKey); - if (storedPermission) { - const permission = JSON.parse(storedPermission); - return new BaseAppAccount(baseRPCUrl, permission.permission, permission.privateKey); + + // Try to load existing permission + const storedData = permissionStorage.getPermission(storageKey); + if (storedData) { + // Check if permission is not expired + const now = Math.floor(Date.now() / 1000); + const permissionEnd = parseInt(storedData.permission.permission.end.toString()); + if (permissionEnd > now) { + try { + // Attempt to create account with stored permission + return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey); + } catch (error) { + console.warn('Failed to initialize with stored permission:', error); + // Permission might be invalid, remove it + permissionStorage.removePermission(storageKey); + } + } else { + // Permission expired, remove it + console.info('Stored permission expired, requesting new one'); + permissionStorage.removePermission(storageKey); + } } // otherwise, prompt user for spend permission and then construct account @@ -51,11 +72,11 @@ export class BaseAppAccount implements Account { provider, }); - // store the permission in local storage - localStorage.setItem(storageKey, JSON.stringify({ + // store the permission using type-safe storage + permissionStorage.setPermission(storageKey, { privateKey, permission, - })); + }); // construct account with the permission return new BaseAppAccount(baseRPCUrl, permission, privateKey); diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index b1757aaa..85494f0d 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,5 +1,6 @@ import { BasePaymentMaker } from '@atxp/client'; -import { Logger } from '@atxp/common'; +import { Logger, Currency } from '@atxp/common'; +import { BigNumber } from 'bignumber.js'; import { prepareSpendCallData } from "@base-org/account/spend-permission"; import { parseEther, WalletClient, createWalletClient, http, publicActions, PublicClient} from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; @@ -24,43 +25,53 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { } // override makePayment to use spend permissions - makePayment = async (amount: BigNumber, currency: string, receiver: string): Promise => { - currency = currency.toLowerCase(); - if (currency !== 'usdc') { + async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { + if (currency !== 'USDC') { throw new Error('Only usdc currency is supported; received ' + currency); } - this._getLogger().info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); + this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); const spendCalls = await prepareSpendCallData(this.spendPermission, BigInt(amount.toString())); - let hash: `0x${string}` | undefined; - spendCalls.forEach(async (call) => - hash = await this.walletClient.sendTransaction({ + const transactionHashes: `0x${string}`[] = []; + // Execute spend calls sequentially to ensure proper order + // Note: prepareSpendCallData may return multiple calls (e.g., permission approval + actual spend) + // TODO: Investigate if these can be parallelized or if order matters + for (const call of spendCalls) { + const hash = await this.walletClient.sendTransaction({ chain: base, to: call.to, data: call.data, value: parseEther('0'), account: this.spendPermission.permission.account as `0x${string}`, - }) - ); + }); + transactionHashes.push(hash); + this.logger.debug(`Spend permission transaction sent: ${hash}`); + } - if (!hash) { - throw new Error('No hash returned from spendPermission sendTransaction'); + if (transactionHashes.length === 0) { + throw new Error('No transaction hashes returned from spendPermission sendTransaction'); } + // Use the last hash for waiting and logging (typically the actual spend transaction) + const hash = transactionHashes[transactionHashes.length - 1]; + // Wait for transaction confirmation with more blocks to ensure propagation - this._getLogger().info(`Waiting for spendPermission transaction confirmation: ${hash}`); + this.logger.info(`Waiting for spendPermission transaction confirmation: ${hash}`); const receipt = await (this.walletClient as unknown as PublicClient).waitForTransactionReceipt({ hash: hash as `0x${string}`, confirmations: 3 // Wait for 3 confirmations to ensure better propagation }); if (receipt.status === 'reverted') { - throw new Error(`spendPermission transaction reverted: ${hash}`); + throw new Error(`spendPermission transaction reverted: ${hash} (all hashes: ${transactionHashes.join(', ')})`); } - this._getLogger().info(`spendPermission transaction confirmed: ${hash} in block ${receipt.blockNumber}`); + this.logger.info(`spendPermission transaction confirmed: ${hash} in block ${receipt.blockNumber}`); + if (transactionHashes.length > 1) { + this.logger.debug(`All transaction hashes from spend permission: ${transactionHashes.join(', ')}`); + } // ok, now the ephemeral wallet has control of the funds, and we need to make the normal payment from here return await super.makePayment(amount, currency, receiver); diff --git a/packages/atxp-base/src/index.ts b/packages/atxp-base/src/index.ts new file mode 100644 index 00000000..3529399a --- /dev/null +++ b/packages/atxp-base/src/index.ts @@ -0,0 +1,10 @@ +export { BaseAppAccount } from './baseAppAccount.js'; +export { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; +export type { SpendPermission } from './types.js'; +export { + type IStorage, + type StoredPermissionData, + PermissionStorage, + BrowserStorage, + MemoryStorage +} from './storage.js'; diff --git a/packages/atxp-base/src/storage.ts b/packages/atxp-base/src/storage.ts new file mode 100644 index 00000000..d0b6914b --- /dev/null +++ b/packages/atxp-base/src/storage.ts @@ -0,0 +1,106 @@ +import { SpendPermission } from './types.js'; + +/** + * Stored permission data structure + */ +export interface StoredPermissionData { + /** Ephemeral wallet private key */ + privateKey: `0x${string}`; + /** Spend permission from Base */ + permission: SpendPermission; +} + +/** + * Storage interface for abstracting storage mechanisms + * This allows for easy mocking in tests and potential future + * support for different storage backends (e.g., React Native AsyncStorage) + */ +export interface IStorage { + getItem(key: string): T | null; + setItem(key: string, value: T): void; + removeItem(key: string): void; +} + +/** + * Type-safe storage wrapper for permission data + */ +export class PermissionStorage { + constructor(private storage: IStorage) {} + + getPermission(key: string): StoredPermissionData | null { + const data = this.storage.getItem(key); + if (!data) return null; + + try { + const parsed = JSON.parse(data); + // Validate the structure + if (this.isValidStoredPermission(parsed)) { + return parsed; + } + return null; + } catch { + return null; + } + } + + setPermission(key: string, data: StoredPermissionData): void { + this.storage.setItem(key, JSON.stringify(data)); + } + + removePermission(key: string): void { + this.storage.removeItem(key); + } + + private isValidStoredPermission(data: any): data is StoredPermissionData { + return ( + data && + typeof data === 'object' && + typeof data.privateKey === 'string' && + data.privateKey.startsWith('0x') && + data.permission && + typeof data.permission === 'object' && + data.permission.permission && + typeof data.permission.permission === 'object' + ); + } +} + +/** + * Browser localStorage implementation + */ +export class BrowserStorage implements IStorage { + getItem(key: string): string | null { + return localStorage.getItem(key); + } + + setItem(key: string, value: string): void { + localStorage.setItem(key, value); + } + + removeItem(key: string): void { + localStorage.removeItem(key); + } +} + +/** + * In-memory storage implementation for testing + */ +export class MemoryStorage implements IStorage { + private store: Map = new Map(); + + getItem(key: string): string | null { + return this.store.get(key) || null; + } + + setItem(key: string, value: string): void { + this.store.set(key, value); + } + + removeItem(key: string): void { + this.store.delete(key); + } + + clear(): void { + this.store.clear(); + } +} diff --git a/packages/atxp-base/vitest.config.ts b/packages/atxp-base/vitest.config.ts index 3a7d8292..45c0cf32 100644 --- a/packages/atxp-base/vitest.config.ts +++ b/packages/atxp-base/vitest.config.ts @@ -4,6 +4,5 @@ export default defineConfig({ test: { environment: 'node', globals: true, - setupFiles: ['./src/setup.expo.ts'], }, }); \ No newline at end of file diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 612d0cd1..75c348c9 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -54,9 +54,10 @@ const ERC20_ABI = [ ]; export class BasePaymentMaker implements PaymentMaker { - private signingClient: ExtendedWalletClient; - private account: ReturnType; - private logger: Logger; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + protected signingClient: ExtendedWalletClient; + protected account: ReturnType; + protected logger: Logger; constructor(baseRPCUrl: string, sourceSecretKey: Hex, logger?: Logger) { if (!baseRPCUrl) { @@ -75,7 +76,7 @@ export class BasePaymentMaker implements PaymentMaker { this.logger = logger ?? new ConsoleLogger(); } - generateJWT = async({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise => { + async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { const headerObj = { alg: 'ES256K' }; // this value is specific to Base const payloadObj = { sub: this.account.address, @@ -106,7 +107,7 @@ export class BasePaymentMaker implements PaymentMaker { return `${header}.${payload}.${signature}`; } - makePayment = async (amount: BigNumber, currency: Currency, receiver: string): Promise => { + async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { if (currency.toUpperCase() !== 'USDC') { throw new PaymentNetworkErrorClass('Only USDC currency is supported; received ' + currency); } From 162a0d2472cbfe728aa81f399ee02d7705951f35 Mon Sep 17 00:00:00 2001 From: bdj Date: Wed, 20 Aug 2025 15:31:24 -0700 Subject: [PATCH 05/53] Fixup build, lint, scripts, etc --- package.json | 9 ++++++-- packages/atxp-base/src/baseAppAccount.ts | 7 +++---- packages/atxp-base/src/storage.ts | 26 ++++++++++++++---------- packages/atxp-base/tsconfig.json | 3 ++- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 961b6944..fb1a9e9c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,12 @@ "description": "ATXP SDK Monorepo - Authorization Token Exchange Protocol packages", "license": "MIT", "workspaces": [ - "packages/*" + "packages/atxp-common", + "packages/atxp-sqlite", + "packages/atxp-redis", + "packages/atxp-server", + "packages/atxp-client", + "packages/atxp-base" ], "repository": { "type": "git", @@ -20,7 +25,7 @@ ], "scripts": { "clean": "rm -rf packages/*/dist packages/*/tsconfig.tsbuildinfo", - "build": "npm run build -w packages/atxp-common && npm run build -w packages/atxp-sqlite && npm run build -w packages/atxp-redis && npm run build -w packages/atxp-server && npm run build -w packages/atxp-client", + "build": "npm run build --workspaces --if-present", "build:dev": "tsc", "typecheck": "npm run typecheck --workspaces --if-present", "lint": "npm run lint --workspaces --if-present", diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 015c8cf3..046cf92a 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -36,14 +36,13 @@ export class BaseAppAccount implements Account { try { // Attempt to create account with stored permission return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey); - } catch (error) { - console.warn('Failed to initialize with stored permission:', error); + } catch { + // Failed to initialize with stored permission, will request new one // Permission might be invalid, remove it permissionStorage.removePermission(storageKey); } } else { - // Permission expired, remove it - console.info('Stored permission expired, requesting new one'); + // Permission expired, remove it and request new one permissionStorage.removePermission(storageKey); } } diff --git a/packages/atxp-base/src/storage.ts b/packages/atxp-base/src/storage.ts index d0b6914b..ceed5295 100644 --- a/packages/atxp-base/src/storage.ts +++ b/packages/atxp-base/src/storage.ts @@ -15,7 +15,7 @@ export interface StoredPermissionData { * This allows for easy mocking in tests and potential future * support for different storage backends (e.g., React Native AsyncStorage) */ -export interface IStorage { +export interface IStorage { getItem(key: string): T | null; setItem(key: string, value: T): void; removeItem(key: string): void; @@ -51,16 +51,20 @@ export class PermissionStorage { this.storage.removeItem(key); } - private isValidStoredPermission(data: any): data is StoredPermissionData { - return ( - data && - typeof data === 'object' && - typeof data.privateKey === 'string' && - data.privateKey.startsWith('0x') && - data.permission && - typeof data.permission === 'object' && - data.permission.permission && - typeof data.permission.permission === 'object' + private isValidStoredPermission(data: unknown): data is StoredPermissionData { + if (!data || typeof data !== 'object' || data === null) { + return false; + } + + const obj = data as Record; + return Boolean( + typeof obj.privateKey === 'string' && + obj.privateKey.startsWith('0x') && + obj.permission && + typeof obj.permission === 'object' && + obj.permission !== null && + 'permission' in obj.permission && + typeof (obj.permission as Record).permission === 'object' ); } } diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index 241b1675..853d3b8e 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -20,6 +20,7 @@ "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"], "references": [ - { "path": "../atxp-common" } + { "path": "../atxp-common" }, + { "path": "../atxp-client" } ] } \ No newline at end of file From 70fc2329d9057f7542876582a42993a9a6ad1801 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 09:50:26 -0700 Subject: [PATCH 06/53] npm install --- package-lock.json | 608 ++++++++++++++++++++-------------------------- 1 file changed, 257 insertions(+), 351 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5575044c..e1f7e1d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,12 @@ "version": "0.2.13", "license": "MIT", "workspaces": [ - "packages/*" + "packages/atxp-common", + "packages/atxp-sqlite", + "packages/atxp-redis", + "packages/atxp-server", + "packages/atxp-client", + "packages/atxp-base" ], "dependencies": { "dotenv": "^16.5.0" @@ -99,18 +104,24 @@ "resolved": "packages/atxp-common", "link": true }, +<<<<<<< HEAD "node_modules/@atxp/redis": { "resolved": "packages/atxp-redis", "link": true }, +======= +>>>>>>> a1d033e (npm install) "node_modules/@atxp/server": { "resolved": "packages/atxp-server", "link": true }, +<<<<<<< HEAD "node_modules/@atxp/sqlite": { "resolved": "packages/atxp-sqlite", "link": true }, +======= +>>>>>>> a1d033e (npm install) "node_modules/@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", @@ -3222,12 +3233,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@ioredis/commands": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.0.tgz", - "integrity": "sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==", - "license": "MIT" - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -6269,20 +6274,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/better-sqlite3": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.2.0.tgz", - "integrity": "sha512-eGbYq2CT+tos1fBwLQ/tkBt9J5M3JEHjku4hbvQUePCckkvVf14xWj+1m7dGoK81M/fOjFT7yM9UMeKT/+vFLQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "20.x || 22.x || 23.x || 24.x" - } - }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -6324,41 +6315,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/bn.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", @@ -6923,15 +6879,6 @@ "node": ">=6" } }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -7424,21 +7371,6 @@ "dev": true, "license": "MIT" }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -7454,6 +7386,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", + "peer": true, "engines": { "node": ">=4.0.0" } @@ -7556,15 +7489,6 @@ "node": ">=0.4.0" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -7596,6 +7520,7 @@ "npm": "1.2.8000 || >= 1.4.16" } }, +<<<<<<< HEAD "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -7609,6 +7534,8 @@ "node": ">=0.10" } }, +======= +>>>>>>> a1d033e (npm install) "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -7711,15 +7638,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -8421,15 +8339,6 @@ "license": "MIT", "peer": true }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/expect-type": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", @@ -9195,12 +9104,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -9370,12 +9273,6 @@ "node": ">=6" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -9814,7 +9711,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/internal-slot": { "version": "1.1.0", @@ -9841,30 +9739,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ioredis": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.7.0.tgz", - "integrity": "sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "^1.3.0", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -11257,18 +11131,6 @@ "license": "MIT", "peer": true }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -11925,18 +11787,6 @@ "node": ">=4" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -11997,12 +11847,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -12039,12 +11883,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -12068,18 +11906,6 @@ "license": "MIT", "peer": true }, - "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -12922,6 +12748,7 @@ "url": "https://opencollective.com/preact" } }, +<<<<<<< HEAD "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -12957,6 +12784,8 @@ "node": ">=8" } }, +======= +>>>>>>> a1d033e (npm install) "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13065,16 +12894,6 @@ "node": ">= 0.10" } }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -13174,6 +12993,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "peer": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -13444,41 +13264,6 @@ "node": ">=0.10.0" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -14396,51 +14181,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-plist": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", @@ -14590,12 +14330,6 @@ "node": ">=6" } }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT" - }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -14651,15 +14385,6 @@ "stream-chain": "^2.2.5" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -14832,6 +14557,7 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -15012,40 +14738,6 @@ "node": ">=18" } }, - "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar/node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", @@ -15446,18 +15138,6 @@ "fsevents": "~2.3.3" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -15763,12 +15443,6 @@ "node": ">=6.14.2" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -16821,12 +16495,15 @@ "vitest": "^3.0.9" } }, +<<<<<<< HEAD <<<<<<< HEAD "packages/atxp-redis": { "name": "@atxp/redis", "version": "0.2.13", ======= <<<<<<< HEAD +======= +>>>>>>> a1d033e (npm install) "packages/atxp-common/node_modules/cssstyle": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", @@ -16835,7 +16512,231 @@ >>>>>>> c8ea810 (flesh out) "license": "MIT", "dependencies": { +<<<<<<< HEAD "@atxp/common": "0.2.13", +======= + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "packages/atxp-common/node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "packages/atxp-common/node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "packages/atxp-common/node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "packages/atxp-common/node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "packages/atxp-common/node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/atxp-common/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "packages/atxp-common/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "packages/atxp-redis-db": { + "name": "@atxp/redis-db", + "version": "0.2.10", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@atxp/common": "^0.2.10", +>>>>>>> a1d033e (npm install) "ioredis": "^5.7.0" }, "devDependencies": { @@ -16847,8 +16748,6 @@ "vitest": "^3.0.9" } }, -======= ->>>>>>> 7e29fd6 (flesh out) "packages/atxp-server": { "name": "@atxp/server", "version": "0.2.13", @@ -16874,9 +16773,16 @@ "vitest": "^3.0.9" } }, +<<<<<<< HEAD "packages/atxp-sqlite": { "name": "@atxp/sqlite", "version": "0.2.13", +======= + "packages/atxp-sqlite-db": { + "name": "@atxp/sqlite-db", + "version": "0.2.10", + "extraneous": true, +>>>>>>> a1d033e (npm install) "license": "MIT", "dependencies": { "@atxp/common": "0.2.13", From cadc299deae5ab4dee9d3333c32b268a1bb62a4c Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 09:51:35 -0700 Subject: [PATCH 07/53] rebase issues --- packages/atxp-client/src/basePaymentMaker.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 75c348c9..34928823 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -54,7 +54,6 @@ const ERC20_ABI = [ ]; export class BasePaymentMaker implements PaymentMaker { - // eslint-disable-next-line @typescript-eslint/no-explicit-any protected signingClient: ExtendedWalletClient; protected account: ReturnType; protected logger: Logger; @@ -117,7 +116,7 @@ export class BasePaymentMaker implements PaymentMaker { try { // Check balance before attempting payment const balanceRaw = await this.signingClient.readContract({ - address: USDC_CONTRACT_ADDRESS as Address, + address: USDC_CONTRACT_ADDRESS_BASE as Address, abi: ERC20_ABI, functionName: 'balanceOf', args: [this.account.address], @@ -141,7 +140,7 @@ export class BasePaymentMaker implements PaymentMaker { const hash = await this.signingClient.sendTransaction({ chain: base, account: this.account, - to: USDC_CONTRACT_ADDRESS, + to: USDC_CONTRACT_ADDRESS_BASE, data: data, value: parseEther('0'), }); From 66c7489bfb053ac1319b395af29e57a8357efdbd Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 13:51:01 -0700 Subject: [PATCH 08/53] In browser context, bind fetch to window to solve IllegalOperation error --- packages/atxp-client/src/atxpClient.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/atxp-client/src/atxpClient.ts b/packages/atxp-client/src/atxpClient.ts index e5cd60d9..c3fff40e 100644 --- a/packages/atxp-client/src/atxpClient.ts +++ b/packages/atxp-client/src/atxpClient.ts @@ -10,11 +10,21 @@ type OptionalClientConfig = Omit; export type ClientArgs = RequiredClientConfig & Partial; type BuildableClientConfigFields = 'oAuthDb' | 'logger'; +// Detect if we're in a browser environment and bind fetch appropriately +const getFetch = (): typeof fetch => { + if (typeof window !== 'undefined' && typeof window.fetch === 'function') { + // In browser, bind fetch to window to avoid "Illegal invocation" errors + return fetch.bind(window); + } + // In Node.js or other environments, use fetch as-is + return fetch; +}; + export const DEFAULT_CLIENT_CONFIG: Required> = { allowedAuthorizationServers: [DEFAULT_AUTHORIZATION_SERVER], approvePayment: async (_p) => true, - fetchFn: fetch, - oAuthChannelFetch: fetch, + fetchFn: getFetch(), + oAuthChannelFetch: getFetch(), allowHttp: false, // may be overridden in buildClientConfig by process.env.NODE_ENV clientInfo: { name: 'ATXPClient', From 25809ed9f4af1617fd9592043787b6cf9ed4ffd7 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 13:51:22 -0700 Subject: [PATCH 09/53] Use minikit for wallet access instead of base-org/account API --- package-lock.json | 117 +---------------------- packages/atxp-base/package.json | 1 - packages/atxp-base/src/baseAppAccount.ts | 91 ++++++++++++++---- 3 files changed, 73 insertions(+), 136 deletions(-) diff --git a/package-lock.json b/package-lock.json index e1f7e1d4..b14e3fa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1819,75 +1819,6 @@ "node": ">=6.9.0" } }, - "node_modules/@base-org/account": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.0.2.tgz", - "integrity": "sha512-p/mefIVfiKxDYWIoZSp1VeCXmh3hqmaD8ThS7YKMnuxljfM6dOJTxvUpZ/emkXvQQa1nnCA+TRVZt1nCrs5ACA==", - "license": "Apache-2.0", - "dependencies": { - "@noble/hashes": "1.4.0", - "clsx": "1.2.1", - "eventemitter3": "5.0.1", - "idb-keyval": "6.2.1", - "ox": "0.6.9", - "preact": "10.24.2", - "viem": "^2.31.7", - "zustand": "5.0.3" - } - }, - "node_modules/@base-org/account/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@base-org/account/node_modules/ox": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", - "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@base-org/account/node_modules/ox/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -6870,15 +6801,6 @@ "node": ">=0.8" } }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9611,12 +9533,6 @@ "node": ">=0.10.0" } }, - "node_modules/idb-keyval": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", - "license": "Apache-2.0" - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -12738,6 +12654,7 @@ "node": "^10 || ^12 || >=14" } }, +<<<<<<< HEAD "node_modules/preact": { "version": "10.24.2", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", @@ -12786,6 +12703,8 @@ }, ======= >>>>>>> a1d033e (npm install) +======= +>>>>>>> 4eb82d9 (Use minikit for wallet access instead of base-org/account API) "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16374,35 +16293,6 @@ "zod": "^3.24.1" } }, - "node_modules/zustand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", - "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, "packages/atxp-base": { "name": "@atxp/base", "version": "0.2.10", @@ -16410,7 +16300,6 @@ "dependencies": { "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", - "@base-org/account": "^2.0.2", "bignumber.js": "^9.3.0", "viem": "^2.34.0" }, diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index a038aaff..85c835f4 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -24,7 +24,6 @@ "dependencies": { "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", - "@base-org/account": "^2.0.2", "bignumber.js": "^9.3.0", "viem": "^2.34.0" }, diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 046cf92a..45a1b2be 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -2,8 +2,8 @@ import type { Account, PaymentMaker } from '@atxp/client'; import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; -import { createBaseAccountSDK } from "@base-org/account"; -import { requestSpendPermission } from "@base-org/account/spend-permission"; +import type { WalletClient } from 'viem'; +import { getAddress } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; @@ -15,12 +15,17 @@ export class BaseAppAccount implements Account { accountId: string; paymentMakers: { [key: string]: PaymentMaker }; - static async initialize(baseRPCUrl: string, userWalletAddress: string, config?: { - appName: string; - allowance?: bigint; - periodInDays?: number; - storage?: IStorage; - }): Promise { + static async initialize( + baseRPCUrl: string, + userWalletAddress: string, + walletClient: WalletClient, + config?: { + appName: string; + allowance?: bigint; + periodInDays?: number; + storage?: IStorage; + } + ): Promise { // Initialize storage with type-safe wrapper const baseStorage = config?.storage || new BrowserStorage(); const permissionStorage = new PermissionStorage(baseStorage); @@ -47,30 +52,74 @@ export class BaseAppAccount implements Account { } } - // otherwise, prompt user for spend permission and then construct account - const sdk = createBaseAccountSDK({ - appName: config?.appName, - appChainIds: [base.id], - }); - const provider = sdk.getProvider(); - // this is an "ephemeral" wallet that only ever lives client-side // BaseAppPayementMaker uses it to pull funds from the user's wallet // and pass them along to the MCP server const privateKey = generatePrivateKey(); const spender = privateKeyToAccount(privateKey); - // request spend permission from the user - const permission = await requestSpendPermission({ + // Create spend permission using wagmi's signTypedData + const now = Math.floor(Date.now() / 1000); + const period = (config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS) * 24 * 60 * 60; + const end = now + period; + + // EIP-712 domain and types for spend permission + const domain = { + name: 'SpendPermissionManager', + version: '1', + chainId: base.id, + verifyingContract: getAddress('0x4b22970FBf7Bb7F3FBe4fD8D68b53e5d497c6E4D'), // SpendPermissionManager on Base + }; + + const types = { + SpendPermission: [ + { name: 'account', type: 'address' }, + { name: 'spender', type: 'address' }, + { name: 'token', type: 'address' }, + { name: 'allowance', type: 'uint160' }, + { name: 'period', type: 'uint48' }, + { name: 'start', type: 'uint48' }, + { name: 'end', type: 'uint48' }, + { name: 'salt', type: 'uint256' }, + { name: 'extraData', type: 'bytes' }, + ], + }; + + const permissionData = { account: userWalletAddress, spender: spender.address, token: USDC_CONTRACT_ADDRESS_BASE, - chainId: base.id, - allowance: config?.allowance ?? DEFAULT_ALLOWANCE, - periodInDays: config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS, - provider, + allowance: (config?.allowance ?? DEFAULT_ALLOWANCE).toString(), + period: period, + start: now, + end: end, + salt: BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)).toString(), + extraData: '0x', + }; + + // Sign the permission using wagmi wallet client + const signature = await walletClient.signTypedData({ + account: userWalletAddress as `0x${string}`, + domain, + types, + primaryType: 'SpendPermission', + message: permissionData, }); + const permission: SpendPermission = { + signature, + permission: { + ...permissionData, + allowance: permissionData.allowance.toString(), + period: permissionData.period, + start: permissionData.start, + end: permissionData.end, + salt: permissionData.salt.toString(), + }, + chainId: base.id, + createdAt: now, + }; + // store the permission using type-safe storage permissionStorage.setPermission(storageKey, { privateKey, From 95343c784fdbfee91958182a70b9a96419bee603 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 14:29:56 -0700 Subject: [PATCH 10/53] Base64url encode isn't on browsers - implement --- packages/atxp-client/src/basePaymentMaker.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 34928823..4b7fba53 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -19,6 +19,16 @@ import { BigNumber } from "bignumber.js"; // Type for the extended wallet client with public actions type ExtendedWalletClient = WalletClient & PublicActions; +// Helper function to convert to base64url that works in both Node.js and browsers +function toBase64Url(data: string): string { + // Convert string to base64 + const base64 = typeof Buffer !== 'undefined' + ? Buffer.from(data).toString('base64') + : btoa(data); + // Convert base64 to base64url + return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); +} + export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; const ERC20_ABI = [ @@ -87,12 +97,14 @@ export class BasePaymentMaker implements PaymentMaker { ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), } as Record; - const header = Buffer.from(JSON.stringify(headerObj)).toString('base64url'); - const payload = Buffer.from(JSON.stringify(payloadObj)).toString('base64url'); + const header = toBase64Url(JSON.stringify(headerObj)); + const payload = toBase64Url(JSON.stringify(payloadObj)); const message = `${header}.${payload}`; // For Ethereum wallets, we need to use personal_sign format - const messageBytes = Buffer.from(message, 'utf8'); + const messageBytes = typeof Buffer !== 'undefined' + ? Buffer.from(message, 'utf8') + : new TextEncoder().encode(message); const signResult = await this.signingClient.signMessage({ account: this.account, message: { raw: messageBytes }, @@ -101,7 +113,7 @@ export class BasePaymentMaker implements PaymentMaker { // The paymcp server expects ES256K signatures as hex strings with 0x prefix // The signResult from viem is already in hex format with 0x prefix (65 bytes) // We encode the hex string itself (including 0x) as base64url - const signature = Buffer.from(signResult, 'utf8').toString('base64url'); + const signature = toBase64Url(signResult); return `${header}.${payload}.${signature}`; } From 868576eac1fc1cb4a4df1ac1cf35c00a2cdb7b56 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 14:58:31 -0700 Subject: [PATCH 11/53] Spend permission working (now failing because ephemeral wallet has no ETH, and we can't give spend permission for that) --- packages/atxp-base/src/baseAppPaymentMaker.ts | 108 ++++++++++++------ 1 file changed, 73 insertions(+), 35 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 85494f0d..fbc668b7 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,8 +1,7 @@ import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { prepareSpendCallData } from "@base-org/account/spend-permission"; -import { parseEther, WalletClient, createWalletClient, http, publicActions, PublicClient} from 'viem'; +import { parseEther, WalletClient, createWalletClient, http, publicActions, PublicClient, encodeFunctionData, getAddress} from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; @@ -10,6 +9,7 @@ import { SpendPermission } from './types.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { private spendPermission: SpendPermission; private walletClient: WalletClient; + private ephemeralAccount: ReturnType; constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, logger?: Logger) { if (!spendPermission) { @@ -17,8 +17,9 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { } super(baseRPCUrl, privateKey, logger); this.spendPermission = spendPermission; + this.ephemeralAccount = privateKeyToAccount(privateKey); this.walletClient = createWalletClient({ - account: privateKeyToAccount(privateKey), + account: this.ephemeralAccount, chain: base, transport: http(baseRPCUrl), }).extend(publicActions); @@ -32,48 +33,85 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); - const spendCalls = await prepareSpendCallData(this.spendPermission, BigInt(amount.toString())); - - const transactionHashes: `0x${string}`[] = []; - // Execute spend calls sequentially to ensure proper order - // Note: prepareSpendCallData may return multiple calls (e.g., permission approval + actual spend) - // TODO: Investigate if these can be parallelized or if order matters - for (const call of spendCalls) { - const hash = await this.walletClient.sendTransaction({ - chain: base, - to: call.to, - data: call.data, - value: parseEther('0'), - account: this.spendPermission.permission.account as `0x${string}`, - }); - transactionHashes.push(hash); - this.logger.debug(`Spend permission transaction sent: ${hash}`); - } - - if (transactionHashes.length === 0) { - throw new Error('No transaction hashes returned from spendPermission sendTransaction'); - } + // Convert USDC amount to its smallest unit (6 decimals) + // 0.01 USDC = 10,000 micro-USDC + const USDC_DECIMALS = 6; + const amountInMicroUsdc = amount.multipliedBy(10 ** USDC_DECIMALS); + const amountBigInt = BigInt(amountInMicroUsdc.toFixed(0)); + + // SpendPermissionManager contract on Base mainnet + const SPEND_PERMISSION_MANAGER = getAddress('0x4b22970FBf7Bb7F3FBe4fD8D68b53e5d497c6E4D'); + + // USDC contract on Base mainnet + const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); + + // Encode the spend permission call + const spendPermissionCalldata = encodeFunctionData({ + abi: [{ + inputs: [ + { name: 'spendPermission', type: 'tuple', components: [ + { name: 'account', type: 'address' }, + { name: 'spender', type: 'address' }, + { name: 'token', type: 'address' }, + { name: 'allowance', type: 'uint160' }, + { name: 'period', type: 'uint48' }, + { name: 'start', type: 'uint48' }, + { name: 'end', type: 'uint48' }, + { name: 'salt', type: 'uint256' }, + { name: 'extraData', type: 'bytes' } + ]}, + { name: 'signature', type: 'bytes' }, + { name: 'amount', type: 'uint160' } + ], + name: 'spend', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }], + functionName: 'spend', + args: [ + { + account: this.spendPermission.permission.account as `0x${string}`, + spender: this.spendPermission.permission.spender as `0x${string}`, + token: this.spendPermission.permission.token as `0x${string}`, + allowance: BigInt(this.spendPermission.permission.allowance), + period: Number(this.spendPermission.permission.period), + start: Number(this.spendPermission.permission.start), + end: Number(this.spendPermission.permission.end), + salt: BigInt(this.spendPermission.permission.salt), + extraData: this.spendPermission.permission.extraData as `0x${string}` + }, + this.spendPermission.signature as `0x${string}`, + amountBigInt + ] + }); + + // Execute the spend permission transaction + // The transaction is sent from the ephemeral wallet (created from privateKey) + // which is the spender in the spend permission + const hash = await this.walletClient.sendTransaction({ + account: this.ephemeralAccount, + chain: base, + to: SPEND_PERMISSION_MANAGER, + data: spendPermissionCalldata, + value: parseEther('0'), + }); - // Use the last hash for waiting and logging (typically the actual spend transaction) - const hash = transactionHashes[transactionHashes.length - 1]; + this.logger.info(`Spend permission transaction sent: ${hash}`); - // Wait for transaction confirmation with more blocks to ensure propagation - this.logger.info(`Waiting for spendPermission transaction confirmation: ${hash}`); + // Wait for transaction confirmation const receipt = await (this.walletClient as unknown as PublicClient).waitForTransactionReceipt({ hash: hash as `0x${string}`, confirmations: 3 // Wait for 3 confirmations to ensure better propagation }); if (receipt.status === 'reverted') { - throw new Error(`spendPermission transaction reverted: ${hash} (all hashes: ${transactionHashes.join(', ')})`); + throw new Error(`Spend permission transaction reverted: ${hash}`); } - this.logger.info(`spendPermission transaction confirmed: ${hash} in block ${receipt.blockNumber}`); - if (transactionHashes.length > 1) { - this.logger.debug(`All transaction hashes from spend permission: ${transactionHashes.join(', ')}`); - } - - // ok, now the ephemeral wallet has control of the funds, and we need to make the normal payment from here + this.logger.info(`Spend permission transaction confirmed: ${hash} in block ${receipt.blockNumber}`); + + // Now the ephemeral wallet has the funds, make the actual payment return await super.makePayment(amount, currency, receiver); } } From c60ad0d1fe22ec4903a5e9f8e237529fcb7c8537 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 16:15:38 -0700 Subject: [PATCH 12/53] SmartWallet --- package-lock.json | 88 ++++++++++++ packages/atxp-base/package.json | 2 + packages/atxp-base/src/baseAppAccount.ts | 29 ++-- packages/atxp-base/src/baseAppPaymentMaker.ts | 108 ++++++++++----- packages/atxp-base/src/index.ts | 1 + packages/atxp-base/src/smartWalletHelpers.ts | 125 ++++++++++++++++++ 6 files changed, 305 insertions(+), 48 deletions(-) create mode 100644 packages/atxp-base/src/smartWalletHelpers.ts diff --git a/package-lock.json b/package-lock.json index b14e3fa5..3b97fc74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,6 +51,16 @@ } } }, + "node_modules/@account-abstraction/contracts": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.8.0.tgz", + "integrity": "sha512-8krPx/gpnoT+5xAroagVCbeA7FbUigMZWXFKKPm+oghyr29Dksssdx5sI7xGv9212i4JPaDDUGFk58dpuwVgHA==", + "license": "MIT", + "dependencies": { + "@openzeppelin/contracts": "^5.1.0", + "@uniswap/v3-periphery": "^1.4.3" + } + }, "node_modules/@adraffy/ens-normalize": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", @@ -3607,6 +3617,12 @@ "node": ">= 8" } }, + "node_modules/@openzeppelin/contracts": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.4.0.tgz", + "integrity": "sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==", + "license": "MIT" + }, "node_modules/@paralleldrive/cuid2": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", @@ -5384,6 +5400,55 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@uniswap/lib": { + "version": "4.0.1-alpha", + "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", + "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "license": "GPL-3.0-or-later", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v2-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "license": "GPL-3.0-or-later", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", + "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", + "license": "BUSL-1.1", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-periphery": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz", + "integrity": "sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@openzeppelin/contracts": "3.4.2-solc-0.7", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "^1.0.1", + "@uniswap/v3-core": "^1.0.0", + "base64-sol": "1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==", + "license": "MIT" + }, "node_modules/@urql/core": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", @@ -6174,6 +6239,12 @@ ], "license": "MIT" }, + "node_modules/base64-sol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", + "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==", + "license": "MIT" + }, "node_modules/better-opn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", @@ -16298,9 +16369,11 @@ "version": "0.2.10", "license": "MIT", "dependencies": { + "@account-abstraction/contracts": "^0.8.0", "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "bignumber.js": "^9.3.0", + "permissionless": "^0.2.54", "viem": "^2.34.0" }, "devDependencies": { @@ -16317,6 +16390,21 @@ "vitest": "^3.0.9" } }, + "packages/atxp-base/node_modules/permissionless": { + "version": "0.2.54", + "resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.2.54.tgz", + "integrity": "sha512-r191GhpndQ9gAQqzxP75n1H2oIezmg7SJlKDEYP/R7v48ZdnXxdyOiLklvW4CRWN5IBKDJ+wUKZXSHfknsWIhQ==", + "license": "MIT", + "peerDependencies": { + "ox": "^0.6.7", + "viem": "^2.28.1" + }, + "peerDependenciesMeta": { + "ox": { + "optional": true + } + } + }, "packages/atxp-client": { "name": "@atxp/client", "version": "0.2.13", diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index 85c835f4..2703019d 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -22,9 +22,11 @@ "test": "vitest run" }, "dependencies": { + "@account-abstraction/contracts": "^0.8.0", "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "bignumber.js": "^9.3.0", + "permissionless": "^0.2.54", "viem": "^2.34.0" }, "devDependencies": { diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 45a1b2be..06b4b5cc 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -7,6 +7,7 @@ import { getAddress } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; +import { createEphemeralSmartWallet, getSmartWalletAddress, type SmartWalletConfig, type EphemeralSmartWallet } from './smartWalletHelpers.js'; const DEFAULT_ALLOWANCE = 10n; const DEFAULT_PERIOD_IN_DAYS = 7; @@ -19,11 +20,12 @@ export class BaseAppAccount implements Account { baseRPCUrl: string, userWalletAddress: string, walletClient: WalletClient, - config?: { + config: { appName: string; allowance?: bigint; periodInDays?: number; storage?: IStorage; + smartWallet: SmartWalletConfig; } ): Promise { // Initialize storage with type-safe wrapper @@ -40,7 +42,7 @@ export class BaseAppAccount implements Account { if (permissionEnd > now) { try { // Attempt to create account with stored permission - return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey); + return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey, config.smartWallet); } catch { // Failed to initialize with stored permission, will request new one // Permission might be invalid, remove it @@ -56,7 +58,10 @@ export class BaseAppAccount implements Account { // BaseAppPayementMaker uses it to pull funds from the user's wallet // and pass them along to the MCP server const privateKey = generatePrivateKey(); - const spender = privateKeyToAccount(privateKey); + + // For smart wallets, we need to get the counterfactual address + const signerAddress = privateKeyToAccount(privateKey).address; + const spenderAddress = await getSmartWalletAddress(signerAddress, config.smartWallet); // Create spend permission using wagmi's signTypedData const now = Math.floor(Date.now() / 1000); @@ -87,7 +92,7 @@ export class BaseAppAccount implements Account { const permissionData = { account: userWalletAddress, - spender: spender.address, + spender: spenderAddress, token: USDC_CONTRACT_ADDRESS_BASE, allowance: (config?.allowance ?? DEFAULT_ALLOWANCE).toString(), period: period, @@ -127,10 +132,10 @@ export class BaseAppAccount implements Account { }); // construct account with the permission - return new BaseAppAccount(baseRPCUrl, permission, privateKey); + return new BaseAppAccount(baseRPCUrl, permission, privateKey, config.smartWallet); } - constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`) { + constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, smartWalletConfig: SmartWalletConfig) { if (!baseRPCUrl) { throw new Error('Base RPC URL is required'); } @@ -140,15 +145,15 @@ export class BaseAppAccount implements Account { if (!spendPermission) { throw new Error('Spend permission is required'); } + if (!smartWalletConfig) { + throw new Error('Smart wallet configuration is required'); + } - const account = privateKeyToAccount(privateKey); + // The accountId is the smart wallet address + this.accountId = spendPermission.permission.spender; - // this is setting the accountId to the address of the *ephemeral* wallet, - // not the user's wallet address. that seems like the least surprising - // thing to do, but it might still cause some confusion... - this.accountId = account.address; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey), + 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey, smartWalletConfig), } } } \ No newline at end of file diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index fbc668b7..41ae2698 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,28 +1,37 @@ import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { parseEther, WalletClient, createWalletClient, http, publicActions, PublicClient, encodeFunctionData, getAddress} from 'viem'; -import { privateKeyToAccount } from 'viem/accounts'; -import { base } from 'viem/chains'; +import { encodeFunctionData, getAddress} from 'viem'; import { SpendPermission } from './types.js'; +import { createEphemeralSmartWallet, type SmartWalletConfig, type EphemeralSmartWallet } from './smartWalletHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { private spendPermission: SpendPermission; - private walletClient: WalletClient; - private ephemeralAccount: ReturnType; + private smartWallet?: EphemeralSmartWallet; + private smartWalletConfig: SmartWalletConfig; + private privateKey: `0x${string}`; - constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, logger?: Logger) { + constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, smartWalletConfig: SmartWalletConfig, logger?: Logger) { if (!spendPermission) { throw new Error('Spend permission is required'); } + if (!smartWalletConfig) { + throw new Error('Smart wallet configuration is required'); + } super(baseRPCUrl, privateKey, logger); this.spendPermission = spendPermission; - this.ephemeralAccount = privateKeyToAccount(privateKey); - this.walletClient = createWalletClient({ - account: this.ephemeralAccount, - chain: base, - transport: http(baseRPCUrl), - }).extend(publicActions); + this.smartWalletConfig = smartWalletConfig; + this.privateKey = privateKey; + } + + // Initialize smart wallet if needed + private async ensureSmartWallet(): Promise { + if (!this.smartWallet) { + this.smartWallet = await createEphemeralSmartWallet( + this.privateKey, + this.smartWalletConfig + ); + } } // override makePayment to use spend permissions @@ -86,32 +95,59 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { ] }); - // Execute the spend permission transaction - // The transaction is sent from the ephemeral wallet (created from privateKey) - // which is the spender in the spend permission - const hash = await this.walletClient.sendTransaction({ - account: this.ephemeralAccount, - chain: base, - to: SPEND_PERMISSION_MANAGER, - data: spendPermissionCalldata, - value: parseEther('0'), + // Ensure smart wallet is initialized + await this.ensureSmartWallet(); + if (!this.smartWallet) { + throw new Error('Failed to initialize smart wallet'); + } + + // For smart wallets, batch the spend permission execution and USDC transfer + // in a single UserOperation to save gas + const USDC_ABI = [{ + inputs: [ + { name: 'to', type: 'address' }, + { name: 'amount', type: 'uint256' } + ], + name: 'transfer', + outputs: [{ name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + }]; + + const usdcTransferCalldata = encodeFunctionData({ + abi: USDC_ABI, + functionName: 'transfer', + args: [receiver as `0x${string}`, amountBigInt] }); - - this.logger.info(`Spend permission transaction sent: ${hash}`); - - // Wait for transaction confirmation - const receipt = await (this.walletClient as unknown as PublicClient).waitForTransactionReceipt({ - hash: hash as `0x${string}`, - confirmations: 3 // Wait for 3 confirmations to ensure better propagation + + // Send UserOperation with both calls + const userOpHash = await this.smartWallet.client.sendUserOperation({ + calls: [ + { + to: SPEND_PERMISSION_MANAGER, + data: spendPermissionCalldata, + value: 0n + }, + { + to: USDC_CONTRACT, + data: usdcTransferCalldata, + value: 0n + } + ] }); - - if (receipt.status === 'reverted') { - throw new Error(`Spend permission transaction reverted: ${hash}`); + + this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); + + // Wait for the UserOperation to be included + const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ + hash: userOpHash + }); + + if (!receipt.success) { + throw new Error(`UserOperation failed: ${userOpHash}`); } - - this.logger.info(`Spend permission transaction confirmed: ${hash} in block ${receipt.blockNumber}`); - - // Now the ephemeral wallet has the funds, make the actual payment - return await super.makePayment(amount, currency, receiver); + + this.logger.info(`UserOperation confirmed: ${userOpHash}`); + return receipt.receipt.transactionHash; } } diff --git a/packages/atxp-base/src/index.ts b/packages/atxp-base/src/index.ts index 3529399a..c625cc4c 100644 --- a/packages/atxp-base/src/index.ts +++ b/packages/atxp-base/src/index.ts @@ -8,3 +8,4 @@ export { BrowserStorage, MemoryStorage } from './storage.js'; +export type { SmartWalletConfig } from './smartWalletHelpers.js'; diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts new file mode 100644 index 00000000..caf1b9fc --- /dev/null +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -0,0 +1,125 @@ +import { + createSmartAccountClient, + type SmartAccountClient, +} from 'permissionless'; +import { + toSimpleSmartAccount, + type ToSimpleSmartAccountReturnType +} from 'permissionless/accounts'; +import { + createPimlicoClient, +} from 'permissionless/clients/pimlico'; +import { + http, + createPublicClient, + type WalletClient, + type Account, + type Address, + type Chain, + type Hex, + parseEther +} from 'viem'; +import { base } from 'viem/chains'; +import { privateKeyToAccount } from 'viem/accounts'; + +// Coinbase CDP Paymaster and Bundler endpoints +const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +const ENTRYPOINT_ADDRESS_V07 = '0x0000000071727De22E5E9d8BAf0edAc6f37da032' as const; + +export interface SmartWalletConfig { + apiKey: string; + paymasterUrl?: string; + bundlerUrl?: string; +} + +export interface EphemeralSmartWallet { + address: Address; + client: SmartAccountClient; + signer: Account; +} + +/** + * Creates an ephemeral smart wallet with paymaster support + */ +export async function createEphemeralSmartWallet( + privateKey: `0x${string}`, + config: SmartWalletConfig +): Promise { + // Create the ephemeral signer + const signer = privateKeyToAccount(privateKey); + + // Create public client + const publicClient = createPublicClient({ + chain: base, + transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) + }); + + // Create the simple account (smart wallet) + const simpleAccount = await toSimpleSmartAccount({ + client: publicClient, + owner: signer, + entryPoint: { + address: ENTRYPOINT_ADDRESS_V07, + version: '0.7' + }, + }); + + // Create pimlico client for paymaster + const pimlicoClient = createPimlicoClient({ + transport: http(config.paymasterUrl || `${COINBASE_PAYMASTER_URL}/${config.apiKey}`), + entryPoint: { + address: ENTRYPOINT_ADDRESS_V07, + version: '0.7' + }, + }); + + // Create smart account client with paymaster + const smartAccountClient = createSmartAccountClient({ + account: simpleAccount, + chain: base, + bundlerTransport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`), + paymaster: pimlicoClient, + }); + + return { + address: simpleAccount.address, + client: smartAccountClient, + signer, + }; +} + +/** + * Gets the counterfactual address for a smart wallet without deploying it + */ +export async function getSmartWalletAddress( + signerAddress: Address, + config: SmartWalletConfig +): Promise
{ + const publicClient = createPublicClient({ + chain: base, + transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) + }); + + // Create a dummy private key to generate a temporary account + // The actual private key doesn't matter since we only need the address + const dummyPrivateKey = '0x0000000000000000000000000000000000000000000000000000000000000001' as `0x${string}`; + const dummySigner = privateKeyToAccount(dummyPrivateKey); + + // Override the address to match the intended signer + const tempAccount = { + ...dummySigner, + address: signerAddress, + }; + + const simpleAccount = await toSimpleSmartAccount({ + client: publicClient, + owner: tempAccount, + entryPoint: { + address: ENTRYPOINT_ADDRESS_V07, + version: '0.7' + }, + }); + + return simpleAccount.address; +} \ No newline at end of file From 5b0f59674191d396e82d528164eb5fe2619ab60b Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 16:22:14 -0700 Subject: [PATCH 13/53] Test; lint --- packages/atxp-base/src/baseAppAccount.ts | 2 +- packages/atxp-base/src/baseAppPaymentMaker.test.ts | 11 +++++++++-- packages/atxp-base/src/smartWalletHelpers.ts | 7 +------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 06b4b5cc..3f06f27a 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -7,7 +7,7 @@ import { getAddress } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; -import { createEphemeralSmartWallet, getSmartWalletAddress, type SmartWalletConfig, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { getSmartWalletAddress, type SmartWalletConfig } from './smartWalletHelpers.js'; const DEFAULT_ALLOWANCE = 10n; const DEFAULT_PERIOD_IN_DAYS = 7; diff --git a/packages/atxp-base/src/baseAppPaymentMaker.test.ts b/packages/atxp-base/src/baseAppPaymentMaker.test.ts index 39d53aa0..21e25edd 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.test.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.test.ts @@ -2,6 +2,7 @@ import { describe, it, expect } from 'vitest'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import { SpendPermission } from './types.js'; +import { SmartWalletConfig } from './smartWalletHelpers.js'; const FAKE_PERMISSION: SpendPermission = { signature: '0x123', @@ -18,11 +19,17 @@ const FAKE_PERMISSION: SpendPermission = { } }; +const FAKE_SMART_WALLET_CONFIG: SmartWalletConfig = { + apiKey: 'test-api-key', + paymasterUrl: 'https://test-paymaster.com', + bundlerUrl: 'https://test-bundler.com' +}; + describe('basePaymentMaker.generateJWT', () => { it('should generate a valid JWT with default payload', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_SMART_WALLET_CONFIG); const jwt = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); // JWT format: header.payload.signature (all base64url) @@ -62,7 +69,7 @@ describe('basePaymentMaker.generateJWT', () => { it('should include payment request id if provided', async () => { const privateKey = generatePrivateKey(); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_SMART_WALLET_CONFIG); const paymentRequestId = 'id1'; const jwt = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); const [, payloadB64] = jwt.split('.'); diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index caf1b9fc..a14c9f90 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -4,7 +4,6 @@ import { } from 'permissionless'; import { toSimpleSmartAccount, - type ToSimpleSmartAccountReturnType } from 'permissionless/accounts'; import { createPimlicoClient, @@ -12,12 +11,8 @@ import { import { http, createPublicClient, - type WalletClient, type Account, type Address, - type Chain, - type Hex, - parseEther } from 'viem'; import { base } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; @@ -35,7 +30,7 @@ export interface SmartWalletConfig { export interface EphemeralSmartWallet { address: Address; - client: SmartAccountClient; + client: SmartAccountClient; signer: Account; } From 8df7ce8398f515582b1341b27b2a673fdf7656ca Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 17:30:29 -0700 Subject: [PATCH 14/53] Delete smart wallet; push on creation --- packages/atxp-base/src/baseAppAccount.ts | 147 +++++++++++++++++- packages/atxp-base/src/baseAppPaymentMaker.ts | 27 +++- packages/atxp-base/src/smartWalletHelpers.ts | 3 + 3 files changed, 170 insertions(+), 7 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 3f06f27a..3f45540d 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -7,7 +7,7 @@ import { getAddress } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; -import { getSmartWalletAddress, type SmartWalletConfig } from './smartWalletHelpers.js'; +import { getSmartWalletAddress, createEphemeralSmartWallet, type SmartWalletConfig } from './smartWalletHelpers.js'; const DEFAULT_ALLOWANCE = 10n; const DEFAULT_PERIOD_IN_DAYS = 7; @@ -28,6 +28,14 @@ export class BaseAppAccount implements Account { smartWallet: SmartWalletConfig; } ): Promise { + // Validate smart wallet configuration + if (!config.smartWallet?.apiKey) { + throw new Error( + 'Smart wallet API key is required. ' + + 'Get your API key from https://portal.cdp.coinbase.com/' + ); + } + // Initialize storage with type-safe wrapper const baseStorage = config?.storage || new BrowserStorage(); const permissionStorage = new PermissionStorage(baseStorage); @@ -41,11 +49,28 @@ export class BaseAppAccount implements Account { const permissionEnd = parseInt(storedData.permission.permission.end.toString()); if (permissionEnd > now) { try { - // Attempt to create account with stored permission - return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey, config.smartWallet); - } catch { + // IMPORTANT: Check if this is a smart wallet permission + // In the old EOA approach, the spender was just the ephemeral private key's address + // In the smart wallet approach, the spender should be a smart wallet address + const ephemeralEOA = privateKeyToAccount(storedData.privateKey).address; + const expectedSmartWallet = await getSmartWalletAddress(ephemeralEOA, config.smartWallet); + + if (storedData.permission.permission.spender.toLowerCase() === ephemeralEOA.toLowerCase()) { + // This is an old EOA permission, invalidate it + console.warn('Found legacy EOA spend permission, clearing it to use smart wallets'); + permissionStorage.removePermission(storageKey); + } else if (storedData.permission.permission.spender.toLowerCase() === expectedSmartWallet.toLowerCase()) { + // This is a valid smart wallet permission + return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey, config.smartWallet); + } else { + // Unknown spender format, clear it to be safe + console.warn('Found spend permission with unexpected spender address, clearing it'); + permissionStorage.removePermission(storageKey); + } + } catch (error) { // Failed to initialize with stored permission, will request new one // Permission might be invalid, remove it + console.error('Failed to validate stored permission:', error); permissionStorage.removePermission(storageKey); } } else { @@ -73,7 +98,7 @@ export class BaseAppAccount implements Account { name: 'SpendPermissionManager', version: '1', chainId: base.id, - verifyingContract: getAddress('0x4b22970FBf7Bb7F3FBe4fD8D68b53e5d497c6E4D'), // SpendPermissionManager on Base + verifyingContract: getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'), // SpendPermissionManager on Base }; const types = { @@ -131,6 +156,70 @@ export class BaseAppAccount implements Account { permission, }); + // Deploy the smart wallet immediately after creating the spend permission + // This ensures the smart wallet exists before any spend permission execution + console.log('Deploying smart wallet to enable spend permissions...'); + try { + const smartWallet = await createEphemeralSmartWallet(privateKey, config.smartWallet); + console.log('Smart wallet created at address:', smartWallet.address); + + // Send a deployment transaction with a dummy call + // The paymaster will cover the deployment cost + // We need at least one call - send 0 ETH to self as a no-op + console.log('Sending deployment UserOperation...'); + const deployTx = await smartWallet.client.sendUserOperation({ + calls: [{ + to: smartWallet.address, + value: 0n, + data: '0x' as `0x${string}` + }] + }); + + console.log('Smart wallet deployment UserOperation sent:', deployTx); + + // Wait for deployment + const receipt = await smartWallet.client.waitForUserOperationReceipt({ + hash: deployTx + }); + + if (receipt.success) { + console.log('✅ Smart wallet deployed successfully at:', smartWallet.address); + console.log('Transaction hash:', receipt.receipt.transactionHash); + } else { + console.error('❌ Smart wallet deployment failed:', receipt); + throw new Error( + `Smart wallet deployment failed. Receipt: ${JSON.stringify(receipt)}` + ); + } + } catch (error) { + console.error('❌ Failed to deploy smart wallet:', error); + if (error instanceof Error) { + console.error('Error message:', error.message); + console.error('Error stack:', error.stack); + + // Check for specific AA13 error + if (error.message.includes('AA13')) { + console.error('\n⚠️ AA13 Error - Common causes:'); + console.error('1. Paymaster not enabled in Coinbase Developer Platform'); + console.error('2. Smart wallet factory contract not allowlisted in paymaster'); + console.error('3. API key invalid or expired'); + console.error('4. Paymaster spending limits exceeded'); + console.error('\nTo fix:'); + console.error('1. Go to https://portal.cdp.coinbase.com/'); + console.error('2. Ensure paymaster is enabled for your API key'); + console.error('3. Add these contracts to your paymaster allowlist:'); + console.error(' - Coinbase Smart Wallet Factory: 0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a'); + console.error(' - USDC: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); + console.error(' - Spend Permission Manager: 0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); + + } + } + throw new Error( + `Failed to deploy smart wallet. This is required for spend permissions to work. ` + + `Original error: ${error instanceof Error ? error.message : String(error)}` + ); + } + // construct account with the permission return new BaseAppAccount(baseRPCUrl, permission, privateKey, config.smartWallet); } @@ -156,4 +245,52 @@ export class BaseAppAccount implements Account { 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey, smartWalletConfig), } } + + /** + * Clear stored spend permission and ephemeral wallet data for a specific wallet + * @param userWalletAddress The user's wallet address + * @param storage Optional storage implementation (defaults to browser localStorage) + */ + static clearStoredPermission( + userWalletAddress: string, + storage?: IStorage + ): void { + const baseStorage = storage || new BrowserStorage(); + const permissionStorage = new PermissionStorage(baseStorage); + const storageKey = `atxp-base-permission-${userWalletAddress}`; + + permissionStorage.removePermission(storageKey); + console.log(`Cleared spend permission for wallet ${userWalletAddress}`); + } + + /** + * Clear all ATXP-related data from storage + * This includes spend permissions and any OAuth tokens + * @param storage Optional storage implementation (defaults to browser localStorage) + */ + static clearAllStoredData(storage?: IStorage): void { + if (typeof window === 'undefined') { + console.warn('clearAllStoredData is only available in browser environments'); + return; + } + + const keysToRemove: string[] = []; + + // Find all ATXP-related keys + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + if (key && (key.includes('atxp') || key.startsWith('0x'))) { + keysToRemove.push(key); + } + } + + // Remove identified keys + console.log(`Clearing ${keysToRemove.length} ATXP-related storage keys`); + keysToRemove.forEach(key => { + console.log('Removing:', key); + localStorage.removeItem(key); + }); + + console.log('All ATXP-related data cleared from storage'); + } } \ No newline at end of file diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 41ae2698..175bdd45 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,7 +1,8 @@ import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, getAddress} from 'viem'; +import { encodeFunctionData, getAddress, createPublicClient, http } from 'viem'; +import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { createEphemeralSmartWallet, type SmartWalletConfig, type EphemeralSmartWallet } from './smartWalletHelpers.js'; @@ -10,6 +11,7 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { private smartWallet?: EphemeralSmartWallet; private smartWalletConfig: SmartWalletConfig; private privateKey: `0x${string}`; + private baseRPCUrl: string; constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, smartWalletConfig: SmartWalletConfig, logger?: Logger) { if (!spendPermission) { @@ -22,6 +24,7 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { this.spendPermission = spendPermission; this.smartWalletConfig = smartWalletConfig; this.privateKey = privateKey; + this.baseRPCUrl = baseRPCUrl; } // Initialize smart wallet if needed @@ -49,7 +52,7 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { const amountBigInt = BigInt(amountInMicroUsdc.toFixed(0)); // SpendPermissionManager contract on Base mainnet - const SPEND_PERMISSION_MANAGER = getAddress('0x4b22970FBf7Bb7F3FBe4fD8D68b53e5d497c6E4D'); + const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); // USDC contract on Base mainnet const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); @@ -101,6 +104,26 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { throw new Error('Failed to initialize smart wallet'); } + // The smart wallet should already be deployed during BaseAppAccount initialization + // If it's not deployed, log a warning but proceed - the paymaster might handle it + const publicClient = createPublicClient({ + chain: base, + transport: http(this.baseRPCUrl) + }); + + const smartWalletCode = await publicClient.getCode({ + address: this.smartWallet.address + }); + + const isDeployed = smartWalletCode !== '0x' && smartWalletCode !== undefined; + + if (!isDeployed) { + this.logger.warn(`Smart wallet not deployed at ${this.smartWallet.address}. It should have been deployed during initialization.`); + this.logger.warn(`The transaction may still succeed if the paymaster handles deployment.`); + } else { + this.logger.info(`Smart wallet is deployed at ${this.smartWallet.address}`); + } + // For smart wallets, batch the spend permission execution and USDC transfer // in a single UserOperation to save gas const USDC_ABI = [{ diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index a14c9f90..66e3f61a 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -60,6 +60,9 @@ export async function createEphemeralSmartWallet( }, }); + // Log the smart wallet address + console.log('Smart wallet address:', simpleAccount.address); + // Create pimlico client for paymaster const pimlicoClient = createPimlicoClient({ transport: http(config.paymasterUrl || `${COINBASE_PAYMASTER_URL}/${config.apiKey}`), From bcae30774d8ed13f741fd26f1681c48ad0a852ef Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 21:05:03 -0700 Subject: [PATCH 15/53] Logs --- packages/atxp-base/src/baseAppAccount.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 3f45540d..d6d9fea5 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -167,6 +167,9 @@ export class BaseAppAccount implements Account { // The paymaster will cover the deployment cost // We need at least one call - send 0 ETH to self as a no-op console.log('Sending deployment UserOperation...'); + console.log('Bundler URL:', config.smartWallet.bundlerUrl || `https://api.developer.coinbase.com/rpc/v1/base/${config.smartWallet.apiKey}`); + console.log('Paymaster URL:', config.smartWallet.paymasterUrl || `https://api.developer.coinbase.com/rpc/v1/base/${config.smartWallet.apiKey}`); + const deployTx = await smartWallet.client.sendUserOperation({ calls: [{ to: smartWallet.address, @@ -200,17 +203,18 @@ export class BaseAppAccount implements Account { // Check for specific AA13 error if (error.message.includes('AA13')) { console.error('\n⚠️ AA13 Error - Common causes:'); - console.error('1. Paymaster not enabled in Coinbase Developer Platform'); - console.error('2. Smart wallet factory contract not allowlisted in paymaster'); + console.error('1. Paymaster configuration issues'); + console.error('2. Paymaster spending limits exceeded'); console.error('3. API key invalid or expired'); - console.error('4. Paymaster spending limits exceeded'); - console.error('\nTo fix:'); - console.error('1. Go to https://portal.cdp.coinbase.com/'); - console.error('2. Ensure paymaster is enabled for your API key'); - console.error('3. Add these contracts to your paymaster allowlist:'); - console.error(' - Coinbase Smart Wallet Factory: 0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a'); - console.error(' - USDC: 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - console.error(' - Spend Permission Manager: 0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); + console.error('4. Issue with EntryPoint contract version mismatch'); + console.error('\nTo debug:'); + console.error('1. Double-check your paymaster settings at https://portal.cdp.coinbase.com/'); + console.error(' - Is "Allow any contract" actually enabled?'); + console.error(' - Are there any spending limits that might be exceeded?'); + console.error(' - Is the paymaster balance sufficient?'); + console.error('2. Check if your API key is for the correct environment (mainnet vs testnet)'); + console.error('3. Factory contract verified to exist at: 0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985'); + console.error('4. Try increasing gas limits if the issue persists'); } } From c9c7ab9fa38e1940eaa6113bf7ef7dc0ff5563f3 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 21:11:20 -0700 Subject: [PATCH 16/53] Coinbase smart wallet --- package-lock.json | 16 ---- packages/atxp-base/package.json | 2 +- packages/atxp-base/src/baseAppAccount.ts | 5 +- packages/atxp-base/src/baseAppPaymentMaker.ts | 29 ++++--- packages/atxp-base/src/smartWalletHelpers.ts | 86 ++++++++----------- 5 files changed, 55 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b97fc74..87fabeb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16373,7 +16373,6 @@ "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "bignumber.js": "^9.3.0", - "permissionless": "^0.2.54", "viem": "^2.34.0" }, "devDependencies": { @@ -16390,21 +16389,6 @@ "vitest": "^3.0.9" } }, - "packages/atxp-base/node_modules/permissionless": { - "version": "0.2.54", - "resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.2.54.tgz", - "integrity": "sha512-r191GhpndQ9gAQqzxP75n1H2oIezmg7SJlKDEYP/R7v48ZdnXxdyOiLklvW4CRWN5IBKDJ+wUKZXSHfknsWIhQ==", - "license": "MIT", - "peerDependencies": { - "ox": "^0.6.7", - "viem": "^2.28.1" - }, - "peerDependenciesMeta": { - "ox": { - "optional": true - } - } - }, "packages/atxp-client": { "name": "@atxp/client", "version": "0.2.13", diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index 2703019d..3e7091d3 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -26,7 +26,7 @@ "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "bignumber.js": "^9.3.0", - "permissionless": "^0.2.54", + "viem": "^2.34.0" }, "devDependencies": { diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index d6d9fea5..6e1ecde3 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -175,7 +175,8 @@ export class BaseAppAccount implements Account { to: smartWallet.address, value: 0n, data: '0x' as `0x${string}` - }] + }], + paymaster: true }); console.log('Smart wallet deployment UserOperation sent:', deployTx); @@ -213,7 +214,7 @@ export class BaseAppAccount implements Account { console.error(' - Are there any spending limits that might be exceeded?'); console.error(' - Is the paymaster balance sufficient?'); console.error('2. Check if your API key is for the correct environment (mainnet vs testnet)'); - console.error('3. Factory contract verified to exist at: 0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985'); + console.error('3. Using Coinbase Smart Wallet Factory'); console.error('4. Try increasing gas limits if the issue persists'); } diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 175bdd45..9e98eeab 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -144,20 +144,21 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { }); // Send UserOperation with both calls - const userOpHash = await this.smartWallet.client.sendUserOperation({ - calls: [ - { - to: SPEND_PERMISSION_MANAGER, - data: spendPermissionCalldata, - value: 0n - }, - { - to: USDC_CONTRACT, - data: usdcTransferCalldata, - value: 0n - } - ] - }); + const userOpHash = await this.smartWallet.client.sendUserOperation({ + calls: [ + { + to: SPEND_PERMISSION_MANAGER, + data: spendPermissionCalldata, + value: 0n + }, + { + to: USDC_CONTRACT, + data: usdcTransferCalldata, + value: 0n + } + ], + paymaster: true + }); this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index 66e3f61a..e46427d9 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -1,13 +1,3 @@ -import { - createSmartAccountClient, - type SmartAccountClient, -} from 'permissionless'; -import { - toSimpleSmartAccount, -} from 'permissionless/accounts'; -import { - createPimlicoClient, -} from 'permissionless/clients/pimlico'; import { http, createPublicClient, @@ -16,11 +6,17 @@ import { } from 'viem'; import { base } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; +import { + toCoinbaseSmartAccount, + createBundlerClient, + createPaymasterClient, + type BundlerClient, + type SmartAccount +} from 'viem/account-abstraction'; // Coinbase CDP Paymaster and Bundler endpoints const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -const ENTRYPOINT_ADDRESS_V07 = '0x0000000071727De22E5E9d8BAf0edAc6f37da032' as const; export interface SmartWalletConfig { apiKey: string; @@ -30,7 +26,8 @@ export interface SmartWalletConfig { export interface EphemeralSmartWallet { address: Address; - client: SmartAccountClient; + client: BundlerClient; + account: SmartAccount; signer: Account; } @@ -50,39 +47,32 @@ export async function createEphemeralSmartWallet( transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) }); - // Create the simple account (smart wallet) - const simpleAccount = await toSimpleSmartAccount({ + // Create the Coinbase smart wallet + const account = await toCoinbaseSmartAccount({ client: publicClient, - owner: signer, - entryPoint: { - address: ENTRYPOINT_ADDRESS_V07, - version: '0.7' - }, + owners: [signer], + version: '1' }); // Log the smart wallet address - console.log('Smart wallet address:', simpleAccount.address); + console.log('Smart wallet address:', account.address); - // Create pimlico client for paymaster - const pimlicoClient = createPimlicoClient({ - transport: http(config.paymasterUrl || `${COINBASE_PAYMASTER_URL}/${config.apiKey}`), - entryPoint: { - address: ENTRYPOINT_ADDRESS_V07, - version: '0.7' - }, - }); - - // Create smart account client with paymaster - const smartAccountClient = createSmartAccountClient({ - account: simpleAccount, + // Create bundler client with paymaster support + const bundlerClient = createBundlerClient({ + account, + client: publicClient, + transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`), chain: base, - bundlerTransport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`), - paymaster: pimlicoClient, + paymaster: true, // Enable paymaster sponsorship + paymasterContext: { + transport: http(config.paymasterUrl || `${COINBASE_PAYMASTER_URL}/${config.apiKey}`) + } }); return { - address: simpleAccount.address, - client: smartAccountClient, + address: account.address, + client: bundlerClient, + account, signer, }; } @@ -99,25 +89,21 @@ export async function getSmartWalletAddress( transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) }); - // Create a dummy private key to generate a temporary account - // The actual private key doesn't matter since we only need the address - const dummyPrivateKey = '0x0000000000000000000000000000000000000000000000000000000000000001' as `0x${string}`; - const dummySigner = privateKeyToAccount(dummyPrivateKey); - - // Override the address to match the intended signer + // Create a temporary account with the signer address + // We need to use the actual signer to get the correct smart wallet address const tempAccount = { - ...dummySigner, address: signerAddress, + type: 'json-rpc' as const, + signMessage: async () => '0x' as `0x${string}`, + signTypedData: async () => '0x' as `0x${string}`, + signTransaction: async () => '0x' as `0x${string}`, }; - const simpleAccount = await toSimpleSmartAccount({ + const smartAccount = await toCoinbaseSmartAccount({ client: publicClient, - owner: tempAccount, - entryPoint: { - address: ENTRYPOINT_ADDRESS_V07, - version: '0.7' - }, + owners: [tempAccount as any], + version: '1' }); - return simpleAccount.address; + return smartAccount.address; } \ No newline at end of file From 1d8790322e546eb9e05f5bfabba05f1fb3263c74 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 21:25:22 -0700 Subject: [PATCH 17/53] Get contract deployed --- packages/atxp-base/src/baseAppAccount.ts | 4 +-- packages/atxp-base/src/smartWalletHelpers.ts | 27 ++++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 6e1ecde3..4fe12675 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -85,8 +85,8 @@ export class BaseAppAccount implements Account { const privateKey = generatePrivateKey(); // For smart wallets, we need to get the counterfactual address - const signerAddress = privateKeyToAccount(privateKey).address; - const spenderAddress = await getSmartWalletAddress(signerAddress, config.smartWallet); + // Pass the private key to get the exact smart wallet address + const spenderAddress = await getSmartWalletAddress(privateKey, config.smartWallet); // Create spend permission using wagmi's signTypedData const now = Math.floor(Date.now() / 1000); diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index e46427d9..44fc4c5c 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -3,6 +3,7 @@ import { createPublicClient, type Account, type Address, + type LocalAccount, } from 'viem'; import { base } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; @@ -81,7 +82,7 @@ export async function createEphemeralSmartWallet( * Gets the counterfactual address for a smart wallet without deploying it */ export async function getSmartWalletAddress( - signerAddress: Address, + signerOrPrivateKey: Address | `0x${string}`, config: SmartWalletConfig ): Promise
{ const publicClient = createPublicClient({ @@ -89,19 +90,23 @@ export async function getSmartWalletAddress( transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) }); - // Create a temporary account with the signer address - // We need to use the actual signer to get the correct smart wallet address - const tempAccount = { - address: signerAddress, - type: 'json-rpc' as const, - signMessage: async () => '0x' as `0x${string}`, - signTypedData: async () => '0x' as `0x${string}`, - signTransaction: async () => '0x' as `0x${string}`, - }; + // Check if we received a private key or just an address + let owner: LocalAccount; + if (signerOrPrivateKey.length === 66) { + // It's a private key + owner = privateKeyToAccount(signerOrPrivateKey as `0x${string}`); + } else { + // It's just an address - we need to return a placeholder + // since we can't create a valid account without a private key + // This is a limitation of the current Coinbase Smart Wallet implementation + console.warn('Cannot compute exact smart wallet address without private key. Using placeholder.'); + // Return a deterministic but placeholder address + return `0x${'0'.repeat(38)}${signerOrPrivateKey.slice(-2)}` as Address; + } const smartAccount = await toCoinbaseSmartAccount({ client: publicClient, - owners: [tempAccount as any], + owners: [owner], version: '1' }); From cde396f4217b4d3751dd45c6e8c48761a72dbed6 Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 21:59:00 -0700 Subject: [PATCH 18/53] More attempts at smart wallet --- packages/atxp-base/src/baseAppAccount.ts | 76 ++++++++++++++++++- packages/atxp-base/src/baseAppPaymentMaker.ts | 70 +++++++++++++---- 2 files changed, 130 insertions(+), 16 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 4fe12675..3f5af3b7 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -3,7 +3,7 @@ import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; import type { WalletClient } from 'viem'; -import { getAddress } from 'viem'; +import { getAddress, createPublicClient, http } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; @@ -53,7 +53,7 @@ export class BaseAppAccount implements Account { // In the old EOA approach, the spender was just the ephemeral private key's address // In the smart wallet approach, the spender should be a smart wallet address const ephemeralEOA = privateKeyToAccount(storedData.privateKey).address; - const expectedSmartWallet = await getSmartWalletAddress(ephemeralEOA, config.smartWallet); + const expectedSmartWallet = await getSmartWalletAddress(storedData.privateKey, config.smartWallet); if (storedData.permission.permission.spender.toLowerCase() === ephemeralEOA.toLowerCase()) { // This is an old EOA permission, invalidate it @@ -84,6 +84,67 @@ export class BaseAppAccount implements Account { // and pass them along to the MCP server const privateKey = generatePrivateKey(); + // Check USDC allowance before creating smart wallet + const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); + const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); + + const publicClient = createPublicClient({ + chain: base, + transport: http(baseRPCUrl) + }); + + const allowance = await publicClient.readContract({ + address: USDC_CONTRACT, + abi: [{ + name: 'allowance', + type: 'function', + stateMutability: 'view', + inputs: [ + { name: 'owner', type: 'address' }, + { name: 'spender', type: 'address' } + ], + outputs: [{ name: '', type: 'uint256' }], + }], + functionName: 'allowance', + args: [userWalletAddress as `0x${string}`, SPEND_PERMISSION_MANAGER], + }); + + console.log('USDC allowance for SpendPermissionManager:', allowance); + + if (allowance === 0n) { + console.log('User needs to approve SpendPermissionManager to spend USDC'); + + // Request approval + try { + const hash = await walletClient.writeContract({ + address: USDC_CONTRACT, + abi: [{ + name: 'approve', + type: 'function', + stateMutability: 'nonpayable', + inputs: [ + { name: 'spender', type: 'address' }, + { name: 'amount', type: 'uint256' } + ], + outputs: [{ name: '', type: 'bool' }], + }], + functionName: 'approve', + args: [SPEND_PERMISSION_MANAGER, BigInt(10 ** 9)], // Approve 1000 USDC + chain: base, + account: userWalletAddress as `0x${string}`, + }); + + console.log('Approval transaction sent:', hash); + + // Wait for approval + await publicClient.waitForTransactionReceipt({ hash }); + console.log('SpendPermissionManager approved successfully'); + } catch (approveError) { + console.error('Failed to approve SpendPermissionManager:', approveError); + throw new Error('SpendPermissionManager must be approved to spend USDC. Please approve the contract at 0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); + } + } + // For smart wallets, we need to get the counterfactual address // Pass the private key to get the exact smart wallet address const spenderAddress = await getSmartWalletAddress(privateKey, config.smartWallet); @@ -128,6 +189,7 @@ export class BaseAppAccount implements Account { }; // Sign the permission using wagmi wallet client + console.log('Requesting signature from wallet for address:', userWalletAddress); const signature = await walletClient.signTypedData({ account: userWalletAddress as `0x${string}`, domain, @@ -135,6 +197,16 @@ export class BaseAppAccount implements Account { primaryType: 'SpendPermission', message: permissionData, }); + + console.log('Received signature:', signature); + console.log('Signature length:', signature.length); + + // Check if this is a smart wallet signature (very long with encoded data) + if (signature.length > 150) { + console.warn('WARNING: Received what appears to be a smart wallet signature'); + console.warn('SpendPermissionManager expects a regular EOA signature'); + console.warn('This will likely cause the transaction to revert'); + } const permission: SpendPermission = { signature, diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 9e98eeab..1a59e5b2 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -57,6 +57,25 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { // USDC contract on Base mainnet const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); + // Debug: Log spend permission details + const now = Math.floor(Date.now() / 1000); + console.log('Spend permission details:', { + account: this.spendPermission.permission.account, + spender: this.spendPermission.permission.spender, + token: this.spendPermission.permission.token, + allowance: this.spendPermission.permission.allowance, + amount: amountBigInt.toString(), + receiver, + smartWallet: this.smartWallet?.address, + currentTime: now, + start: this.spendPermission.permission.start, + end: this.spendPermission.permission.end, + isValid: now >= Number(this.spendPermission.permission.start) && now <= Number(this.spendPermission.permission.end), + salt: this.spendPermission.permission.salt, + extraData: this.spendPermission.permission.extraData, + signature: this.spendPermission.signature + }); + // Encode the spend permission call const spendPermissionCalldata = encodeFunctionData({ abi: [{ @@ -124,8 +143,9 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { this.logger.info(`Smart wallet is deployed at ${this.smartWallet.address}`); } - // For smart wallets, batch the spend permission execution and USDC transfer - // in a single UserOperation to save gas + // For smart wallets, we need to execute the spend permission + // The SpendPermissionManager will transfer USDC from user to smart wallet + // Then we need to forward it to the final receiver const USDC_ABI = [{ inputs: [ { name: 'to', type: 'address' }, @@ -143,8 +163,9 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { args: [receiver as `0x${string}`, amountBigInt] }); - // Send UserOperation with both calls - const userOpHash = await this.smartWallet.client.sendUserOperation({ + // Send UserOperation with both calls in sequence + try { + const userOpHash = await this.smartWallet.client.sendUserOperation({ calls: [ { to: SPEND_PERMISSION_MANAGER, @@ -160,18 +181,39 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { paymaster: true }); - this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); + this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); - // Wait for the UserOperation to be included - const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ - hash: userOpHash - }); + // Wait for the UserOperation to be included + const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ + hash: userOpHash + }); - if (!receipt.success) { - throw new Error(`UserOperation failed: ${userOpHash}`); - } + if (!receipt.success) { + throw new Error(`UserOperation failed: ${userOpHash}`); + } - this.logger.info(`UserOperation confirmed: ${userOpHash}`); - return receipt.receipt.transactionHash; + this.logger.info(`UserOperation confirmed: ${userOpHash}`); + return receipt.receipt.transactionHash; + } catch (error) { + console.error('UserOperation failed:', error); + + // Try to decode the specific error + if (error instanceof Error && error.message.includes('execution reverted')) { + console.error('The transaction reverted. Possible reasons:'); + console.error('1. The SpendPermissionManager rejected the spend permission'); + console.error('2. The permission signature might be invalid'); + console.error('3. The permission might have already been used (check salt)'); + console.error('4. The smart wallet might not be the correct spender'); + + // Log the permission details again for debugging + console.error('Permission was:', { + account: this.spendPermission.permission.account, + spender: this.spendPermission.permission.spender, + smartWallet: this.smartWallet?.address + }); + } + + throw error; + } } } From 71d4e7aac65bedf0c1a479fd11e5ef44a9a29cde Mon Sep 17 00:00:00 2001 From: bdj Date: Thu, 21 Aug 2025 22:26:25 -0700 Subject: [PATCH 19/53] Debugging --- packages/atxp-base/src/baseAppAccount.ts | 11 ++++++---- packages/atxp-base/src/baseAppPaymentMaker.ts | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 3f5af3b7..67f83ba5 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -201,11 +201,14 @@ export class BaseAppAccount implements Account { console.log('Received signature:', signature); console.log('Signature length:', signature.length); - // Check if this is a smart wallet signature (very long with encoded data) + // MiniKit returns smart wallet signatures with WebAuthn data + // We'll try to use them as-is and see if the contract can handle them if (signature.length > 150) { - console.warn('WARNING: Received what appears to be a smart wallet signature'); - console.warn('SpendPermissionManager expects a regular EOA signature'); - console.warn('This will likely cause the transaction to revert'); + console.log('Smart wallet signature detected - attempting to use with SpendPermissionManager'); + console.log('Signature format analysis:'); + console.log('- Length:', signature.length); + console.log('- Starts with 0x:', signature.startsWith('0x')); + console.log('- Contains webauthn data:', signature.includes('webauthn')); } const permission: SpendPermission = { diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 1a59e5b2..e9e1d2ff 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -197,6 +197,28 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { } catch (error) { console.error('UserOperation failed:', error); + // Add detailed debugging for spend permission errors + if (error instanceof Error && error.message.includes('Execution reverted')) { + console.error('=== SPEND PERMISSION DEBUGGING ==='); + console.error('Spend permission details:'); + console.error('- Account:', this.spendPermission.permission.account); + console.error('- Spender:', this.spendPermission.permission.spender); + console.error('- Token:', this.spendPermission.permission.token); + console.error('- Allowance:', this.spendPermission.permission.allowance); + console.error('- Amount:', amountBigInt.toString()); + console.error('- Receiver:', receiver); + console.error('- Smart Wallet:', this.smartWallet?.address); + console.error('- Current Time:', Math.floor(Date.now() / 1000)); + console.error('- Start:', Number(this.spendPermission.permission.start)); + console.error('- End:', Number(this.spendPermission.permission.end)); + console.error('- Is Valid:', Number(this.spendPermission.permission.start) <= Math.floor(Date.now() / 1000) && Math.floor(Date.now() / 1000) <= Number(this.spendPermission.permission.end)); + console.error('- Salt:', this.spendPermission.permission.salt); + console.error('- Extra Data:', this.spendPermission.permission.extraData); + console.error('- Signature Length:', this.spendPermission.signature.length); + console.error('- Signature Preview:', this.spendPermission.signature.substring(0, 100) + '...'); + console.error('=== END DEBUGGING ==='); + } + // Try to decode the specific error if (error instanceof Error && error.message.includes('execution reverted')) { console.error('The transaction reverted. Possible reasons:'); From 2ed496f011143cc697405a0ed5970bc89bbb7a93 Mon Sep 17 00:00:00 2001 From: bdj Date: Fri, 22 Aug 2025 11:39:04 -0700 Subject: [PATCH 20/53] Refactor/simplify --- packages/atxp-base/src/baseAppAccount.ts | 323 ++++++++---------- .../atxp-base/src/baseAppPaymentMaker.test.ts | 11 +- packages/atxp-base/src/baseAppPaymentMaker.ts | 260 +++++++------- packages/atxp-base/src/index.ts | 5 +- packages/atxp-base/src/smartWalletHelpers.ts | 24 +- packages/atxp-base/src/storage.ts | 57 +--- 6 files changed, 293 insertions(+), 387 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 67f83ba5..deb0d7d5 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -6,8 +6,9 @@ import type { WalletClient } from 'viem'; import { getAddress, createPublicClient, http } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; -import { IStorage, BrowserStorage, PermissionStorage } from './storage.js'; -import { getSmartWalletAddress, createEphemeralSmartWallet, type SmartWalletConfig } from './smartWalletHelpers.js'; +import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; +import { getSmartWalletAddress, toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { Logger } from '@atxp/common'; const DEFAULT_ALLOWANCE = 10n; const DEFAULT_PERIOD_IN_DAYS = 7; @@ -16,6 +17,10 @@ export class BaseAppAccount implements Account { accountId: string; paymentMakers: { [key: string]: PaymentMaker }; + private static toStorageKey(userWalletAddress: string): string { + return `atxp-base-permission-${userWalletAddress}`; + } + static async initialize( baseRPCUrl: string, userWalletAddress: string, @@ -25,66 +30,93 @@ export class BaseAppAccount implements Account { allowance?: bigint; periodInDays?: number; storage?: IStorage; - smartWallet: SmartWalletConfig; - } + apiKey: string; + }, + logger?: Logger, ): Promise { // Validate smart wallet configuration - if (!config.smartWallet?.apiKey) { + if (!config.apiKey) { throw new Error( 'Smart wallet API key is required. ' + 'Get your API key from https://portal.cdp.coinbase.com/' ); } - // Initialize storage with type-safe wrapper + // Initialize storage const baseStorage = config?.storage || new BrowserStorage(); - const permissionStorage = new PermissionStorage(baseStorage); - const storageKey = `atxp-base-permission-${userWalletAddress}`; + const storage = new IntermediaryStorage(baseStorage); + const storageKey = this.toStorageKey(userWalletAddress); // Try to load existing permission - const storedData = permissionStorage.getPermission(storageKey); - if (storedData) { - // Check if permission is not expired - const now = Math.floor(Date.now() / 1000); - const permissionEnd = parseInt(storedData.permission.permission.end.toString()); - if (permissionEnd > now) { - try { - // IMPORTANT: Check if this is a smart wallet permission - // In the old EOA approach, the spender was just the ephemeral private key's address - // In the smart wallet approach, the spender should be a smart wallet address - const ephemeralEOA = privateKeyToAccount(storedData.privateKey).address; - const expectedSmartWallet = await getSmartWalletAddress(storedData.privateKey, config.smartWallet); - - if (storedData.permission.permission.spender.toLowerCase() === ephemeralEOA.toLowerCase()) { - // This is an old EOA permission, invalidate it - console.warn('Found legacy EOA spend permission, clearing it to use smart wallets'); - permissionStorage.removePermission(storageKey); - } else if (storedData.permission.permission.spender.toLowerCase() === expectedSmartWallet.toLowerCase()) { - // This is a valid smart wallet permission - return new BaseAppAccount(baseRPCUrl, storedData.permission, storedData.privateKey, config.smartWallet); - } else { - // Unknown spender format, clear it to be safe - console.warn('Found spend permission with unexpected spender address, clearing it'); - permissionStorage.removePermission(storageKey); - } - } catch (error) { - // Failed to initialize with stored permission, will request new one - // Permission might be invalid, remove it - console.error('Failed to validate stored permission:', error); - permissionStorage.removePermission(storageKey); - } - } else { - // Permission expired, remove it and request new one - permissionStorage.removePermission(storageKey); - } + const existingData = await this.loadSavedWalletAndPermission(storage, storageKey); + if (existingData) { + const smartWallet = await toEphemeralSmartWallet(existingData.privateKey, config.apiKey); + return new BaseAppAccount(baseRPCUrl, existingData.permission, existingData.privateKey, smartWallet, logger); } - // this is an "ephemeral" wallet that only ever lives client-side - // BaseAppPayementMaker uses it to pull funds from the user's wallet - // and pass them along to the MCP server + // Create new wallet and permission const privateKey = generatePrivateKey(); // Check USDC allowance before creating smart wallet + await this.checkAndRequestUSDCApproval(baseRPCUrl, userWalletAddress, walletClient); + + // Create spend permission + const permission = await this.createSpendPermission( + baseRPCUrl, + userWalletAddress, + walletClient, + privateKey, + config + ); + + // Deploy smart wallet + await this.deploySmartWallet(privateKey, config.apiKey); + + // Create smart wallet instance for payment maker + const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); + + // Save wallet and permission + await this.saveWalletAndPermission(storage, storageKey, privateKey, permission); + + return new BaseAppAccount(baseRPCUrl, permission, privateKey, smartWallet); + } + + private static async saveWalletAndPermission( + permissionStorage: IntermediaryStorage, + storageKey: string, + privateKey: `0x${string}`, + permission: SpendPermission + ): Promise { + permissionStorage.set(storageKey, { + privateKey, + permission, + }); + } + + + private static async loadSavedWalletAndPermission( + permissionStorage: IntermediaryStorage, + storageKey: string + ): Promise { + const storedData = permissionStorage.get(storageKey); + if (!storedData) return null; + + // Check if permission is not expired + const now = Math.floor(Date.now() / 1000); + const permissionEnd = parseInt(storedData.permission.permission.end.toString()); + if (permissionEnd <= now) { + permissionStorage.delete(storageKey); + return null; + } + + return storedData; + } + + private static async checkAndRequestUSDCApproval( + baseRPCUrl: string, + userWalletAddress: string, + walletClient: WalletClient + ): Promise { const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); @@ -112,9 +144,6 @@ export class BaseAppAccount implements Account { console.log('USDC allowance for SpendPermissionManager:', allowance); if (allowance === 0n) { - console.log('User needs to approve SpendPermissionManager to spend USDC'); - - // Request approval try { const hash = await walletClient.writeContract({ address: USDC_CONTRACT, @@ -144,22 +173,31 @@ export class BaseAppAccount implements Account { throw new Error('SpendPermissionManager must be approved to spend USDC. Please approve the contract at 0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); } } + } - // For smart wallets, we need to get the counterfactual address - // Pass the private key to get the exact smart wallet address - const spenderAddress = await getSmartWalletAddress(privateKey, config.smartWallet); + private static async createSpendPermission( + baseRPCUrl: string, + userWalletAddress: string, + walletClient: WalletClient, + privateKey: `0x${string}`, + config: { + appName: string; + allowance?: bigint; + periodInDays?: number; + apiKey: string; + } + ): Promise { + const spenderAddress = await getSmartWalletAddress(privateKey, config.apiKey); - // Create spend permission using wagmi's signTypedData const now = Math.floor(Date.now() / 1000); const period = (config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS) * 24 * 60 * 60; const end = now + period; - // EIP-712 domain and types for spend permission const domain = { name: 'SpendPermissionManager', version: '1', chainId: base.id, - verifyingContract: getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'), // SpendPermissionManager on Base + verifyingContract: getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'), }; const types = { @@ -197,21 +235,8 @@ export class BaseAppAccount implements Account { primaryType: 'SpendPermission', message: permissionData, }); - - console.log('Received signature:', signature); - console.log('Signature length:', signature.length); - - // MiniKit returns smart wallet signatures with WebAuthn data - // We'll try to use them as-is and see if the contract can handle them - if (signature.length > 150) { - console.log('Smart wallet signature detected - attempting to use with SpendPermissionManager'); - console.log('Signature format analysis:'); - console.log('- Length:', signature.length); - console.log('- Starts with 0x:', signature.startsWith('0x')); - console.log('- Contains webauthn data:', signature.includes('webauthn')); - } - const permission: SpendPermission = { + return { signature, permission: { ...permissionData, @@ -224,87 +249,43 @@ export class BaseAppAccount implements Account { chainId: base.id, createdAt: now, }; + } - // store the permission using type-safe storage - permissionStorage.setPermission(storageKey, { - privateKey, - permission, - }); - - // Deploy the smart wallet immediately after creating the spend permission - // This ensures the smart wallet exists before any spend permission execution + private static async deploySmartWallet( + privateKey: `0x${string}`, + apiKey: string + ): Promise { console.log('Deploying smart wallet to enable spend permissions...'); - try { - const smartWallet = await createEphemeralSmartWallet(privateKey, config.smartWallet); - console.log('Smart wallet created at address:', smartWallet.address); - - // Send a deployment transaction with a dummy call - // The paymaster will cover the deployment cost - // We need at least one call - send 0 ETH to self as a no-op - console.log('Sending deployment UserOperation...'); - console.log('Bundler URL:', config.smartWallet.bundlerUrl || `https://api.developer.coinbase.com/rpc/v1/base/${config.smartWallet.apiKey}`); - console.log('Paymaster URL:', config.smartWallet.paymasterUrl || `https://api.developer.coinbase.com/rpc/v1/base/${config.smartWallet.apiKey}`); - - const deployTx = await smartWallet.client.sendUserOperation({ - calls: [{ - to: smartWallet.address, - value: 0n, - data: '0x' as `0x${string}` - }], - paymaster: true - }); - - console.log('Smart wallet deployment UserOperation sent:', deployTx); - - // Wait for deployment - const receipt = await smartWallet.client.waitForUserOperationReceipt({ - hash: deployTx - }); - - if (receipt.success) { - console.log('✅ Smart wallet deployed successfully at:', smartWallet.address); - console.log('Transaction hash:', receipt.receipt.transactionHash); - } else { - console.error('❌ Smart wallet deployment failed:', receipt); - throw new Error( - `Smart wallet deployment failed. Receipt: ${JSON.stringify(receipt)}` - ); - } - } catch (error) { - console.error('❌ Failed to deploy smart wallet:', error); - if (error instanceof Error) { - console.error('Error message:', error.message); - console.error('Error stack:', error.stack); - - // Check for specific AA13 error - if (error.message.includes('AA13')) { - console.error('\n⚠️ AA13 Error - Common causes:'); - console.error('1. Paymaster configuration issues'); - console.error('2. Paymaster spending limits exceeded'); - console.error('3. API key invalid or expired'); - console.error('4. Issue with EntryPoint contract version mismatch'); - console.error('\nTo debug:'); - console.error('1. Double-check your paymaster settings at https://portal.cdp.coinbase.com/'); - console.error(' - Is "Allow any contract" actually enabled?'); - console.error(' - Are there any spending limits that might be exceeded?'); - console.error(' - Is the paymaster balance sufficient?'); - console.error('2. Check if your API key is for the correct environment (mainnet vs testnet)'); - console.error('3. Using Coinbase Smart Wallet Factory'); - console.error('4. Try increasing gas limits if the issue persists'); - - } - } - throw new Error( - `Failed to deploy smart wallet. This is required for spend permissions to work. ` + - `Original error: ${error instanceof Error ? error.message : String(error)}` - ); + + const smartWallet = await toEphemeralSmartWallet(privateKey, apiKey); + + const deployTx = await smartWallet.client.sendUserOperation({ + calls: [{ + to: smartWallet.address, + value: 0n, + data: '0x' as `0x${string}` + }], + paymaster: true + }); + + const receipt = await smartWallet.client.waitForUserOperationReceipt({ + hash: deployTx + }); + + if (!receipt.success) { + throw new Error(`Smart wallet deployment failed. Receipt: ${JSON.stringify(receipt)}`); } - - // construct account with the permission - return new BaseAppAccount(baseRPCUrl, permission, privateKey, config.smartWallet); + + console.log('✅ Smart wallet deployed successfully at:', smartWallet.address); } - constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, smartWalletConfig: SmartWalletConfig) { + constructor( + baseRPCUrl: string, + spendPermission: SpendPermission, + privateKey: `0x${string}`, + smartWallet: EphemeralSmartWallet, + logger?: Logger + ) { if (!baseRPCUrl) { throw new Error('Base RPC URL is required'); } @@ -314,63 +295,29 @@ export class BaseAppAccount implements Account { if (!spendPermission) { throw new Error('Spend permission is required'); } - if (!smartWalletConfig) { - throw new Error('Smart wallet configuration is required'); + if (!smartWallet) { + throw new Error('Smart wallet required'); } - // The accountId is the smart wallet address this.accountId = spendPermission.permission.spender; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey, smartWalletConfig), + 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey, smartWallet, logger), } } - /** - * Clear stored spend permission and ephemeral wallet data for a specific wallet - * @param userWalletAddress The user's wallet address - * @param storage Optional storage implementation (defaults to browser localStorage) - */ - static clearStoredPermission( - userWalletAddress: string, - storage?: IStorage - ): void { - const baseStorage = storage || new BrowserStorage(); - const permissionStorage = new PermissionStorage(baseStorage); - const storageKey = `atxp-base-permission-${userWalletAddress}`; - - permissionStorage.removePermission(storageKey); - console.log(`Cleared spend permission for wallet ${userWalletAddress}`); - } - /** * Clear all ATXP-related data from storage * This includes spend permissions and any OAuth tokens * @param storage Optional storage implementation (defaults to browser localStorage) */ - static clearAllStoredData(storage?: IStorage): void { - if (typeof window === 'undefined') { - console.warn('clearAllStoredData is only available in browser environments'); - return; + static clearAllStoredData(userWalletAddress: string, storage?: IStorage): void { + if (typeof window === 'undefined' && !storage) { + throw new Error('clearAllStoredData requires a storage to be provided outside of browser environments'); } + storage = storage || new BrowserStorage(); - const keysToRemove: string[] = []; - - // Find all ATXP-related keys - for (let i = 0; i < localStorage.length; i++) { - const key = localStorage.key(i); - if (key && (key.includes('atxp') || key.startsWith('0x'))) { - keysToRemove.push(key); - } - } - - // Remove identified keys - console.log(`Clearing ${keysToRemove.length} ATXP-related storage keys`); - keysToRemove.forEach(key => { - console.log('Removing:', key); - localStorage.removeItem(key); - }); - - console.log('All ATXP-related data cleared from storage'); + storage.delete(this.toStorageKey(userWalletAddress)); + console.log(`All ATXP-related data cleared from storage for ${userWalletAddress}`); } } \ No newline at end of file diff --git a/packages/atxp-base/src/baseAppPaymentMaker.test.ts b/packages/atxp-base/src/baseAppPaymentMaker.test.ts index 21e25edd..769f8527 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.test.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.test.ts @@ -2,7 +2,6 @@ import { describe, it, expect } from 'vitest'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import { SpendPermission } from './types.js'; -import { SmartWalletConfig } from './smartWalletHelpers.js'; const FAKE_PERMISSION: SpendPermission = { signature: '0x123', @@ -19,17 +18,13 @@ const FAKE_PERMISSION: SpendPermission = { } }; -const FAKE_SMART_WALLET_CONFIG: SmartWalletConfig = { - apiKey: 'test-api-key', - paymasterUrl: 'https://test-paymaster.com', - bundlerUrl: 'https://test-bundler.com' -}; +const FAKE_API_KEY = 'test-api-key'; describe('basePaymentMaker.generateJWT', () => { it('should generate a valid JWT with default payload', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_SMART_WALLET_CONFIG); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_API_KEY); const jwt = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); // JWT format: header.payload.signature (all base64url) @@ -69,7 +64,7 @@ describe('basePaymentMaker.generateJWT', () => { it('should include payment request id if provided', async () => { const privateKey = generatePrivateKey(); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_SMART_WALLET_CONFIG); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_API_KEY); const paymentRequestId = 'id1'; const jwt = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); const [, payloadB64] = jwt.split('.'); diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index e9e1d2ff..e98e5168 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,63 +1,59 @@ import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, getAddress, createPublicClient, http } from 'viem'; -import { base } from 'viem/chains'; +import { encodeFunctionData, getAddress } from 'viem'; import { SpendPermission } from './types.js'; -import { createEphemeralSmartWallet, type SmartWalletConfig, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { private spendPermission: SpendPermission; - private smartWallet?: EphemeralSmartWallet; - private smartWalletConfig: SmartWalletConfig; - private privateKey: `0x${string}`; - private baseRPCUrl: string; + private smartWallet: EphemeralSmartWallet; - constructor(baseRPCUrl: string, spendPermission: SpendPermission, privateKey: `0x${string}`, smartWalletConfig: SmartWalletConfig, logger?: Logger) { + constructor( + baseRPCUrl: string, + spendPermission: SpendPermission, + privateKey: `0x${string}`, + smartWallet: EphemeralSmartWallet, + logger?: Logger + ) { if (!spendPermission) { throw new Error('Spend permission is required'); } - if (!smartWalletConfig) { - throw new Error('Smart wallet configuration is required'); - } super(baseRPCUrl, privateKey, logger); this.spendPermission = spendPermission; - this.smartWalletConfig = smartWalletConfig; - this.privateKey = privateKey; - this.baseRPCUrl = baseRPCUrl; + this.smartWallet = smartWallet; } - // Initialize smart wallet if needed - private async ensureSmartWallet(): Promise { - if (!this.smartWallet) { - this.smartWallet = await createEphemeralSmartWallet( - this.privateKey, - this.smartWalletConfig - ); - } - } // override makePayment to use spend permissions async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { + this.validatePaymentRequest(currency); + + const amountBigInt = this.convertAmountToBigInt(amount); + + this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); + + this.logPaymentDetails(amountBigInt, receiver); + + // Execute the payment transaction + return await this.executePaymentTransaction(amountBigInt, receiver); + } + + private validatePaymentRequest(currency: Currency): void { if (currency !== 'USDC') { throw new Error('Only usdc currency is supported; received ' + currency); } + } - this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); - + private convertAmountToBigInt(amount: BigNumber): bigint { // Convert USDC amount to its smallest unit (6 decimals) // 0.01 USDC = 10,000 micro-USDC const USDC_DECIMALS = 6; const amountInMicroUsdc = amount.multipliedBy(10 ** USDC_DECIMALS); - const amountBigInt = BigInt(amountInMicroUsdc.toFixed(0)); - - // SpendPermissionManager contract on Base mainnet - const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); - - // USDC contract on Base mainnet - const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - - // Debug: Log spend permission details + return BigInt(amountInMicroUsdc.toFixed(0)); + } + + private logPaymentDetails(amountBigInt: bigint, receiver: string): void { const now = Math.floor(Date.now() / 1000); console.log('Spend permission details:', { account: this.spendPermission.permission.account, @@ -75,9 +71,25 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { extraData: this.spendPermission.permission.extraData, signature: this.spendPermission.signature }); + } + + private async executePaymentTransaction(amountBigInt: bigint, receiver: string): Promise { + const spendPermissionCalldata = this.prepareSpendPermissionCall(amountBigInt); + const usdcTransferCalldata = this.prepareUSDCTransferCall(amountBigInt, receiver); + + try { + const userOpHash = await this.sendUserOperation(spendPermissionCalldata, usdcTransferCalldata); + return await this.waitForUserOperation(userOpHash); + } catch (error) { + this.handleTransactionError(error, amountBigInt, receiver); + throw error; + } + } + + private prepareSpendPermissionCall(amountBigInt: bigint): `0x${string}` { + const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); - // Encode the spend permission call - const spendPermissionCalldata = encodeFunctionData({ + return encodeFunctionData({ abi: [{ inputs: [ { name: 'spendPermission', type: 'tuple', components: [ @@ -116,36 +128,11 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { amountBigInt ] }); - - // Ensure smart wallet is initialized - await this.ensureSmartWallet(); - if (!this.smartWallet) { - throw new Error('Failed to initialize smart wallet'); - } + } - // The smart wallet should already be deployed during BaseAppAccount initialization - // If it's not deployed, log a warning but proceed - the paymaster might handle it - const publicClient = createPublicClient({ - chain: base, - transport: http(this.baseRPCUrl) - }); - - const smartWalletCode = await publicClient.getCode({ - address: this.smartWallet.address - }); - - const isDeployed = smartWalletCode !== '0x' && smartWalletCode !== undefined; + private prepareUSDCTransferCall(amountBigInt: bigint, receiver: string): `0x${string}` { + const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - if (!isDeployed) { - this.logger.warn(`Smart wallet not deployed at ${this.smartWallet.address}. It should have been deployed during initialization.`); - this.logger.warn(`The transaction may still succeed if the paymaster handles deployment.`); - } else { - this.logger.info(`Smart wallet is deployed at ${this.smartWallet.address}`); - } - - // For smart wallets, we need to execute the spend permission - // The SpendPermissionManager will transfer USDC from user to smart wallet - // Then we need to forward it to the final receiver const USDC_ABI = [{ inputs: [ { name: 'to', type: 'address' }, @@ -157,85 +144,92 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { type: 'function' }]; - const usdcTransferCalldata = encodeFunctionData({ + return encodeFunctionData({ abi: USDC_ABI, functionName: 'transfer', args: [receiver as `0x${string}`, amountBigInt] }); + } - // Send UserOperation with both calls in sequence - try { - const userOpHash = await this.smartWallet.client.sendUserOperation({ - calls: [ - { - to: SPEND_PERMISSION_MANAGER, - data: spendPermissionCalldata, - value: 0n - }, - { - to: USDC_CONTRACT, - data: usdcTransferCalldata, - value: 0n - } - ], - paymaster: true - }); + private async sendUserOperation( + spendPermissionCalldata: `0x${string}`, + usdcTransferCalldata: `0x${string}` + ): Promise<`0x${string}`> { + const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); + const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); + const userOpHash = await this.smartWallet.client.sendUserOperation({ + calls: [ + { + to: SPEND_PERMISSION_MANAGER, + data: spendPermissionCalldata, + value: 0n + }, + { + to: USDC_CONTRACT, + data: usdcTransferCalldata, + value: 0n + } + ], + paymaster: true + }); - // Wait for the UserOperation to be included - const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ - hash: userOpHash - }); + this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); + return userOpHash; + } - if (!receipt.success) { - throw new Error(`UserOperation failed: ${userOpHash}`); - } + private async waitForUserOperation(userOpHash: `0x${string}`): Promise { + const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ + hash: userOpHash + }); - this.logger.info(`UserOperation confirmed: ${userOpHash}`); - return receipt.receipt.transactionHash; - } catch (error) { - console.error('UserOperation failed:', error); - - // Add detailed debugging for spend permission errors - if (error instanceof Error && error.message.includes('Execution reverted')) { - console.error('=== SPEND PERMISSION DEBUGGING ==='); - console.error('Spend permission details:'); - console.error('- Account:', this.spendPermission.permission.account); - console.error('- Spender:', this.spendPermission.permission.spender); - console.error('- Token:', this.spendPermission.permission.token); - console.error('- Allowance:', this.spendPermission.permission.allowance); - console.error('- Amount:', amountBigInt.toString()); - console.error('- Receiver:', receiver); - console.error('- Smart Wallet:', this.smartWallet?.address); - console.error('- Current Time:', Math.floor(Date.now() / 1000)); - console.error('- Start:', Number(this.spendPermission.permission.start)); - console.error('- End:', Number(this.spendPermission.permission.end)); - console.error('- Is Valid:', Number(this.spendPermission.permission.start) <= Math.floor(Date.now() / 1000) && Math.floor(Date.now() / 1000) <= Number(this.spendPermission.permission.end)); - console.error('- Salt:', this.spendPermission.permission.salt); - console.error('- Extra Data:', this.spendPermission.permission.extraData); - console.error('- Signature Length:', this.spendPermission.signature.length); - console.error('- Signature Preview:', this.spendPermission.signature.substring(0, 100) + '...'); - console.error('=== END DEBUGGING ==='); - } - - // Try to decode the specific error - if (error instanceof Error && error.message.includes('execution reverted')) { - console.error('The transaction reverted. Possible reasons:'); - console.error('1. The SpendPermissionManager rejected the spend permission'); - console.error('2. The permission signature might be invalid'); - console.error('3. The permission might have already been used (check salt)'); - console.error('4. The smart wallet might not be the correct spender'); - - // Log the permission details again for debugging - console.error('Permission was:', { - account: this.spendPermission.permission.account, - spender: this.spendPermission.permission.spender, - smartWallet: this.smartWallet?.address - }); - } + if (!receipt.success) { + throw new Error(`UserOperation failed: ${userOpHash}`); + } + + this.logger.info(`UserOperation confirmed: ${userOpHash}`); + return receipt.receipt.transactionHash; + } + + private handleTransactionError(error: unknown, amountBigInt: bigint, receiver: string): void { + console.error('UserOperation failed:', error); + + // Add detailed debugging for spend permission errors + if (error instanceof Error && error.message.includes('Execution reverted')) { + console.error('=== SPEND PERMISSION DEBUGGING ==='); + console.error('Spend permission details:'); + console.error('- Account:', this.spendPermission.permission.account); + console.error('- Spender:', this.spendPermission.permission.spender); + console.error('- Token:', this.spendPermission.permission.token); + console.error('- Allowance:', this.spendPermission.permission.allowance); + console.error('- Amount:', amountBigInt.toString()); + console.error('- Receiver:', receiver); + console.error('- Smart Wallet:', this.smartWallet.address); + console.error('- Current Time:', Math.floor(Date.now() / 1000)); + console.error('- Start:', Number(this.spendPermission.permission.start)); + console.error('- End:', Number(this.spendPermission.permission.end)); + console.error('- Is Valid:', Number(this.spendPermission.permission.start) <= Math.floor(Date.now() / 1000) && Math.floor(Date.now() / 1000) <= Number(this.spendPermission.permission.end)); + console.error('- Salt:', this.spendPermission.permission.salt); + console.error('- Extra Data:', this.spendPermission.permission.extraData); + console.error('- Signature Length:', this.spendPermission.signature.length); + console.error('- Signature Preview:', this.spendPermission.signature.substring(0, 100) + '...'); + console.error('=== END DEBUGGING ==='); + } + + // Try to decode the specific error + if (error instanceof Error && error.message.includes('execution reverted')) { + console.error('The transaction reverted. Possible reasons:'); + console.error('1. The SpendPermissionManager rejected the spend permission'); + console.error('2. The permission signature might be invalid'); + console.error('3. The permission might have already been used (check salt)'); + console.error('4. The smart wallet might not be the correct spender'); - throw error; + // Log the permission details again for debugging + console.error('Permission was:', { + account: this.spendPermission.permission.account, + spender: this.spendPermission.permission.spender, + smartWallet: this.smartWallet.address + }); } } } diff --git a/packages/atxp-base/src/index.ts b/packages/atxp-base/src/index.ts index c625cc4c..3c010df6 100644 --- a/packages/atxp-base/src/index.ts +++ b/packages/atxp-base/src/index.ts @@ -3,9 +3,8 @@ export { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; export type { SpendPermission } from './types.js'; export { type IStorage, - type StoredPermissionData, - PermissionStorage, + type Intermediary as StoredPermissionData, + IntermediaryStorage as PermissionStorage, BrowserStorage, MemoryStorage } from './storage.js'; -export type { SmartWalletConfig } from './smartWalletHelpers.js'; diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index 44fc4c5c..cc247dd7 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -19,12 +19,6 @@ import { const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -export interface SmartWalletConfig { - apiKey: string; - paymasterUrl?: string; - bundlerUrl?: string; -} - export interface EphemeralSmartWallet { address: Address; client: BundlerClient; @@ -35,17 +29,18 @@ export interface EphemeralSmartWallet { /** * Creates an ephemeral smart wallet with paymaster support */ -export async function createEphemeralSmartWallet( +export async function toEphemeralSmartWallet( privateKey: `0x${string}`, - config: SmartWalletConfig + apiKey: string ): Promise { // Create the ephemeral signer + // TODO: WAIT, WHAT? const signer = privateKeyToAccount(privateKey); // Create public client const publicClient = createPublicClient({ chain: base, - transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) }); // Create the Coinbase smart wallet @@ -55,18 +50,15 @@ export async function createEphemeralSmartWallet( version: '1' }); - // Log the smart wallet address - console.log('Smart wallet address:', account.address); - // Create bundler client with paymaster support const bundlerClient = createBundlerClient({ account, client: publicClient, - transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`), + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), chain: base, paymaster: true, // Enable paymaster sponsorship paymasterContext: { - transport: http(config.paymasterUrl || `${COINBASE_PAYMASTER_URL}/${config.apiKey}`) + transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) } }); @@ -83,11 +75,11 @@ export async function createEphemeralSmartWallet( */ export async function getSmartWalletAddress( signerOrPrivateKey: Address | `0x${string}`, - config: SmartWalletConfig + apiKey: string ): Promise
{ const publicClient = createPublicClient({ chain: base, - transport: http(config.bundlerUrl || `${COINBASE_BUNDLER_URL}/${config.apiKey}`) + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) }); // Check if we received a private key or just an address diff --git a/packages/atxp-base/src/storage.ts b/packages/atxp-base/src/storage.ts index ceed5295..88cd99bd 100644 --- a/packages/atxp-base/src/storage.ts +++ b/packages/atxp-base/src/storage.ts @@ -3,7 +3,7 @@ import { SpendPermission } from './types.js'; /** * Stored permission data structure */ -export interface StoredPermissionData { +export interface Intermediary { /** Ephemeral wallet private key */ privateKey: `0x${string}`; /** Spend permission from Base */ @@ -16,56 +16,35 @@ export interface StoredPermissionData { * support for different storage backends (e.g., React Native AsyncStorage) */ export interface IStorage { - getItem(key: string): T | null; - setItem(key: string, value: T): void; - removeItem(key: string): void; + get(key: string): T | null; + set(key: string, value: T): void; + delete(key: string): void; } /** * Type-safe storage wrapper for permission data */ -export class PermissionStorage { +export class IntermediaryStorage { constructor(private storage: IStorage) {} - getPermission(key: string): StoredPermissionData | null { - const data = this.storage.getItem(key); + get(key: string): Intermediary | null { + const data = this.storage.get(key); if (!data) return null; try { const parsed = JSON.parse(data); - // Validate the structure - if (this.isValidStoredPermission(parsed)) { - return parsed; - } - return null; + return parsed as Intermediary; } catch { return null; } } - setPermission(key: string, data: StoredPermissionData): void { - this.storage.setItem(key, JSON.stringify(data)); - } - - removePermission(key: string): void { - this.storage.removeItem(key); + set(key: string, data: Intermediary): void { + this.storage.set(key, JSON.stringify(data)); } - private isValidStoredPermission(data: unknown): data is StoredPermissionData { - if (!data || typeof data !== 'object' || data === null) { - return false; - } - - const obj = data as Record; - return Boolean( - typeof obj.privateKey === 'string' && - obj.privateKey.startsWith('0x') && - obj.permission && - typeof obj.permission === 'object' && - obj.permission !== null && - 'permission' in obj.permission && - typeof (obj.permission as Record).permission === 'object' - ); + delete(key: string): void { + this.storage.delete(key); } } @@ -73,15 +52,15 @@ export class PermissionStorage { * Browser localStorage implementation */ export class BrowserStorage implements IStorage { - getItem(key: string): string | null { + get(key: string): string | null { return localStorage.getItem(key); } - setItem(key: string, value: string): void { + set(key: string, value: string): void { localStorage.setItem(key, value); } - removeItem(key: string): void { + delete(key: string): void { localStorage.removeItem(key); } } @@ -92,15 +71,15 @@ export class BrowserStorage implements IStorage { export class MemoryStorage implements IStorage { private store: Map = new Map(); - getItem(key: string): string | null { + get(key: string): string | null { return this.store.get(key) || null; } - setItem(key: string, value: string): void { + set(key: string, value: string): void { this.store.set(key, value); } - removeItem(key: string): void { + delete(key: string): void { this.store.delete(key); } From 49bb5144aabd623e3a5c444645fbac3026aaec2a Mon Sep 17 00:00:00 2001 From: bdj Date: Fri, 22 Aug 2025 12:32:30 -0700 Subject: [PATCH 21/53] Further debugging and simplification --- packages/atxp-base/src/baseAppAccount.ts | 44 +++++++------------- packages/atxp-base/src/smartWalletHelpers.ts | 7 +--- 2 files changed, 18 insertions(+), 33 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index deb0d7d5..9d71e0a6 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -7,7 +7,7 @@ import { getAddress, createPublicClient, http } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; -import { getSmartWalletAddress, toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { Logger } from '@atxp/common'; const DEFAULT_ALLOWANCE = 10n; @@ -48,7 +48,7 @@ export class BaseAppAccount implements Account { const storageKey = this.toStorageKey(userWalletAddress); // Try to load existing permission - const existingData = await this.loadSavedWalletAndPermission(storage, storageKey); + const existingData = this.loadSavedWalletAndPermission(storage, storageKey); if (existingData) { const smartWallet = await toEphemeralSmartWallet(existingData.privateKey, config.apiKey); return new BaseAppAccount(baseRPCUrl, existingData.permission, existingData.privateKey, smartWallet, logger); @@ -56,48 +56,34 @@ export class BaseAppAccount implements Account { // Create new wallet and permission const privateKey = generatePrivateKey(); + const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); + console.log('Generated intermediate wallet:', smartWallet.address); // Check USDC allowance before creating smart wallet - await this.checkAndRequestUSDCApproval(baseRPCUrl, userWalletAddress, walletClient); + // TODO: We probably need to keep this - it's stored on-chain, so doesn't wipe when we clear storage + //await this.checkAndRequestUSDCApproval(baseRPCUrl, userWalletAddress, walletClient); // Create spend permission const permission = await this.createSpendPermission( - baseRPCUrl, userWalletAddress, walletClient, - privateKey, + smartWallet.address, config ); // Deploy smart wallet - await this.deploySmartWallet(privateKey, config.apiKey); - - // Create smart wallet instance for payment maker - const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); + //await this.deploySmartWallet(privateKey, config.apiKey); // Save wallet and permission - await this.saveWalletAndPermission(storage, storageKey, privateKey, permission); + storage.set(storageKey, {privateKey, permission}); return new BaseAppAccount(baseRPCUrl, permission, privateKey, smartWallet); } - private static async saveWalletAndPermission( - permissionStorage: IntermediaryStorage, - storageKey: string, - privateKey: `0x${string}`, - permission: SpendPermission - ): Promise { - permissionStorage.set(storageKey, { - privateKey, - permission, - }); - } - - - private static async loadSavedWalletAndPermission( + private static loadSavedWalletAndPermission( permissionStorage: IntermediaryStorage, storageKey: string - ): Promise { + ): Intermediary | null { const storedData = permissionStorage.get(storageKey); if (!storedData) return null; @@ -176,10 +162,10 @@ export class BaseAppAccount implements Account { } private static async createSpendPermission( - baseRPCUrl: string, userWalletAddress: string, walletClient: WalletClient, - privateKey: `0x${string}`, + //privateKey: `0x${string}`, + spenderAddress: string, config: { appName: string; allowance?: bigint; @@ -187,7 +173,7 @@ export class BaseAppAccount implements Account { apiKey: string; } ): Promise { - const spenderAddress = await getSmartWalletAddress(privateKey, config.apiKey); + //const spenderAddress = await getSmartWalletAddress(privateKey, config.apiKey); const now = Math.floor(Date.now() / 1000); const period = (config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS) * 24 * 60 * 60; @@ -236,6 +222,8 @@ export class BaseAppAccount implements Account { message: permissionData, }); + console.log(`Signed SpendPermission for ${userWalletAddress} with spender ${spenderAddress}`); + return { signature, permission: { diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index cc247dd7..7bd2c62b 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -33,11 +33,8 @@ export async function toEphemeralSmartWallet( privateKey: `0x${string}`, apiKey: string ): Promise { - // Create the ephemeral signer - // TODO: WAIT, WHAT? const signer = privateKeyToAccount(privateKey); - // Create public client const publicClient = createPublicClient({ chain: base, transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) @@ -73,7 +70,7 @@ export async function toEphemeralSmartWallet( /** * Gets the counterfactual address for a smart wallet without deploying it */ -export async function getSmartWalletAddress( +/*export async function getSmartWalletAddress( signerOrPrivateKey: Address | `0x${string}`, apiKey: string ): Promise
{ @@ -103,4 +100,4 @@ export async function getSmartWalletAddress( }); return smartAccount.address; -} \ No newline at end of file +}*/ \ No newline at end of file From 51b230723d382e30dacf59a3678d2da0b31d59c3 Mon Sep 17 00:00:00 2001 From: bdj Date: Fri, 22 Aug 2025 16:30:50 -0700 Subject: [PATCH 22/53] Try using main account with BasePaymentMaker to sign --- package-lock.json | 122 +++++++++++++++++- package.json | 3 +- packages/atxp-base/src/baseAppAccount.ts | 28 ++-- packages/atxp-base/src/baseAppPaymentMaker.ts | 10 +- packages/atxp-base/tsconfig.json | 13 +- packages/atxp-client/tsconfig.json | 12 +- packages/atxp-common/tsconfig.json | 14 +- tsconfig.json | 10 +- 8 files changed, 177 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87fabeb9..1dd543d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "packages/atxp-base" ], "dependencies": { + "@base-org/account": "^2.0.2", "dotenv": "^16.5.0" }, "devDependencies": { @@ -32,7 +33,7 @@ "node-mocks-http": "^1.17.2", "supertest": "^7.1.4", "tsx": "^4.19.2", - "typescript": "^5.7.3", + "typescript": "^5.5.3", "vitest": "^3.0.9" } }, @@ -1829,6 +1830,75 @@ "node": ">=6.9.0" } }, + "node_modules/@base-org/account": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.0.2.tgz", + "integrity": "sha512-p/mefIVfiKxDYWIoZSp1VeCXmh3hqmaD8ThS7YKMnuxljfM6dOJTxvUpZ/emkXvQQa1nnCA+TRVZt1nCrs5ACA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "1.4.0", + "clsx": "1.2.1", + "eventemitter3": "5.0.1", + "idb-keyval": "6.2.1", + "ox": "0.6.9", + "preact": "10.24.2", + "viem": "^2.31.7", + "zustand": "5.0.3" + } + }, + "node_modules/@base-org/account/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@base-org/account/node_modules/ox": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@base-org/account/node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -6872,6 +6942,15 @@ "node": ">=0.8" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9604,6 +9683,12 @@ "node": ">=0.10.0" } }, + "node_modules/idb-keyval": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", + "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", + "license": "Apache-2.0" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -12726,6 +12811,9 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) "node_modules/preact": { "version": "10.24.2", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", @@ -12736,6 +12824,7 @@ "url": "https://opencollective.com/preact" } }, +<<<<<<< HEAD <<<<<<< HEAD "node_modules/prebuild-install": { "version": "7.1.3", @@ -12776,6 +12865,8 @@ >>>>>>> a1d033e (npm install) ======= >>>>>>> 4eb82d9 (Use minikit for wallet access instead of base-org/account API) +======= +>>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16364,6 +16455,35 @@ "zod": "^3.24.1" } }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, "packages/atxp-base": { "name": "@atxp/base", "version": "0.2.10", diff --git a/package.json b/package.json index fb1a9e9c..41b8b665 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "dev:cli": "npm run build && npm run build:dev && node dist/cli.js" }, "dependencies": { + "@base-org/account": "^2.0.2", "dotenv": "^16.5.0" }, "devDependencies": { @@ -52,7 +53,7 @@ "node-mocks-http": "^1.17.2", "supertest": "^7.1.4", "tsx": "^4.19.2", - "typescript": "^5.7.3", + "typescript": "^5.5.3", "vitest": "^3.0.9" } } diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 9d71e0a6..e30954bd 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -3,7 +3,7 @@ import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; import type { WalletClient } from 'viem'; -import { getAddress, createPublicClient, http } from 'viem'; +import { getAddress, createPublicClient, http, Account as ViemAccount } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; @@ -51,13 +51,16 @@ export class BaseAppAccount implements Account { const existingData = this.loadSavedWalletAndPermission(storage, storageKey); if (existingData) { const smartWallet = await toEphemeralSmartWallet(existingData.privateKey, config.apiKey); - return new BaseAppAccount(baseRPCUrl, existingData.permission, existingData.privateKey, smartWallet, logger); + const account = privateKeyToAccount(existingData.privateKey); + return new BaseAppAccount(baseRPCUrl, existingData.permission, account, smartWallet, logger); } // Create new wallet and permission const privateKey = generatePrivateKey(); const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); - console.log('Generated intermediate wallet:', smartWallet.address); + console.log('Generated ephemeral wallet:', smartWallet.address); + // Deploy smart wallet + //await this.deploySmartWallet(privateKey, config.apiKey); // Check USDC allowance before creating smart wallet // TODO: We probably need to keep this - it's stored on-chain, so doesn't wipe when we clear storage @@ -71,13 +74,16 @@ export class BaseAppAccount implements Account { config ); - // Deploy smart wallet - //await this.deploySmartWallet(privateKey, config.apiKey); - // Save wallet and permission storage.set(storageKey, {privateKey, permission}); - return new BaseAppAccount(baseRPCUrl, permission, privateKey, smartWallet); + // TODO: TEMPORARY HACK- USE MAIN ACCOUNT TO PAY + //const account = privateKeyToAccount(privateKey); + const account = walletClient.account; + if (!account) { + throw new Error('Account is required'); + } + return new BaseAppAccount(baseRPCUrl, permission, account, smartWallet); } private static loadSavedWalletAndPermission( @@ -270,15 +276,15 @@ export class BaseAppAccount implements Account { constructor( baseRPCUrl: string, spendPermission: SpendPermission, - privateKey: `0x${string}`, + account: ViemAccount, smartWallet: EphemeralSmartWallet, logger?: Logger ) { if (!baseRPCUrl) { throw new Error('Base RPC URL is required'); } - if (!privateKey) { - throw new Error('Private key (for ephemeral wallet) is required'); + if (!account) { + throw new Error('Account is required'); } if (!spendPermission) { throw new Error('Spend permission is required'); @@ -290,7 +296,7 @@ export class BaseAppAccount implements Account { this.accountId = spendPermission.permission.spender; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, privateKey, smartWallet, logger), + 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, account, smartWallet, logger), } } diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index e98e5168..0263ff20 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,7 +1,7 @@ import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, getAddress } from 'viem'; +import { encodeFunctionData, getAddress, Account } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; @@ -12,21 +12,21 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { constructor( baseRPCUrl: string, spendPermission: SpendPermission, - privateKey: `0x${string}`, + account: Account, smartWallet: EphemeralSmartWallet, logger?: Logger ) { if (!spendPermission) { throw new Error('Spend permission is required'); } - super(baseRPCUrl, privateKey, logger); + super(baseRPCUrl, account, logger); this.spendPermission = spendPermission; this.smartWallet = smartWallet; } // override makePayment to use spend permissions - async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { + /*async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { this.validatePaymentRequest(currency); const amountBigInt = this.convertAmountToBigInt(amount); @@ -231,5 +231,5 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { smartWallet: this.smartWallet.address }); } - } + }*/ } diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index 853d3b8e..0e38511d 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", - "lib": ["ES2020", "DOM"], + "lib": ["ES2022", "DOM"], "outDir": "./dist", "rootDir": "./src", "strict": true, @@ -15,12 +15,15 @@ "declarationMap": true, "sourceMap": true, "allowSyntheticDefaultImports": true, - "composite": true + "composite": true, + "allowImportingTsExtensions": false, + "noEmit": false, + "exactOptionalPropertyTypes": false, + "noUncheckedIndexedAccess": false }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"], "references": [ - { "path": "../atxp-common" }, - { "path": "../atxp-client" } + { "path": "../atxp-common" } ] } \ No newline at end of file diff --git a/packages/atxp-client/tsconfig.json b/packages/atxp-client/tsconfig.json index 36aa2bd1..0e38511d 100644 --- a/packages/atxp-client/tsconfig.json +++ b/packages/atxp-client/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "ESNext", - "moduleResolution": "node", - "lib": ["ES2020", "DOM"], + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], "outDir": "./dist", "rootDir": "./src", "strict": true, @@ -15,7 +15,11 @@ "declarationMap": true, "sourceMap": true, "allowSyntheticDefaultImports": true, - "composite": true + "composite": true, + "allowImportingTsExtensions": false, + "noEmit": false, + "exactOptionalPropertyTypes": false, + "noUncheckedIndexedAccess": false }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"], diff --git a/packages/atxp-common/tsconfig.json b/packages/atxp-common/tsconfig.json index 9a7d3d37..e3e25e4b 100644 --- a/packages/atxp-common/tsconfig.json +++ b/packages/atxp-common/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "ESNext", - "moduleResolution": "node", - "lib": ["ES2020", "DOM"], + "moduleResolution": "bundler", + "lib": ["ES2022", "DOM"], "outDir": "./dist", "rootDir": "./src", "strict": true, @@ -15,8 +15,12 @@ "declarationMap": true, "sourceMap": true, "allowSyntheticDefaultImports": true, - "composite": true + "composite": true, + "allowImportingTsExtensions": false, + "noEmit": false, + "exactOptionalPropertyTypes": false, + "noUncheckedIndexedAccess": false }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist", "**/*.test.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"] } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 658e5e0a..ee5c778d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "ESNext", - "lib": ["ES2020", "DOM"], + "lib": ["ES2022", "DOM"], "outDir": "./dist", "strict": true, "esModuleInterop": true, @@ -11,7 +11,11 @@ "resolveJsonModule": true, "moduleResolution": "bundler", "declaration": false, - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "allowImportingTsExtensions": false, + "noEmit": false, + "exactOptionalPropertyTypes": false, + "noUncheckedIndexedAccess": false }, "include": ["src/dev/**/*.ts"], "exclude": ["node_modules", "dist", "examples", "packages"] From 86d7a3c719d7410cbf35b8762e84bfc0aafe3dc6 Mon Sep 17 00:00:00 2001 From: bdj Date: Fri, 22 Aug 2025 16:35:55 -0700 Subject: [PATCH 23/53] More minor basePaymentMaker refactor for account --- packages/atxp-client/src/baseAccount.ts | 2 +- packages/atxp-client/src/basePaymentMaker.ts | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/atxp-client/src/baseAccount.ts b/packages/atxp-client/src/baseAccount.ts index 3efcd429..f375829a 100644 --- a/packages/atxp-client/src/baseAccount.ts +++ b/packages/atxp-client/src/baseAccount.ts @@ -18,7 +18,7 @@ export class BaseAccount implements Account { this.accountId = account.address; this.paymentMakers = { - 'base': new BasePaymentMaker(baseRPCUrl, sourceSecretKey), + 'base': BasePaymentMaker.fromSecretKey(baseRPCUrl, sourceSecretKey), } } } \ No newline at end of file diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 4b7fba53..a4475133 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -11,6 +11,7 @@ import { encodeFunctionData, WalletClient, PublicActions, + Account, } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; @@ -65,18 +66,23 @@ const ERC20_ABI = [ export class BasePaymentMaker implements PaymentMaker { protected signingClient: ExtendedWalletClient; - protected account: ReturnType; + protected account: Account; protected logger: Logger; - constructor(baseRPCUrl: string, sourceSecretKey: Hex, logger?: Logger) { + static fromSecretKey(baseRPCUrl: string, sourceSecretKey: Hex, logger?: Logger): BasePaymentMaker { + const account = privateKeyToAccount(sourceSecretKey); + return new BasePaymentMaker(baseRPCUrl, account, logger); + } + + constructor(baseRPCUrl: string, account: Account, logger?: Logger) { if (!baseRPCUrl) { throw new Error('Base RPC URL is required'); } - if (!sourceSecretKey) { - throw new Error('Source secret key is required'); + if (!account) { + throw new Error('Account is required'); } - this.account = privateKeyToAccount(sourceSecretKey); + this.account = account; this.signingClient = createWalletClient({ account: this.account, chain: base, From b3b224b3bb8e48b1c30f729397e4c2e85bbc4d48 Mon Sep 17 00:00:00 2001 From: bdj Date: Sun, 24 Aug 2025 09:07:37 -0700 Subject: [PATCH 24/53] Some sort of working signing --- packages/atxp-base/src/baseAppAccount.ts | 28 ++++++++++- packages/atxp-base/src/baseAppPaymentMaker.ts | 25 +++++----- packages/atxp-client/src/baseAccount.ts | 9 +++- packages/atxp-client/src/basePaymentMaker.ts | 47 ++++++++++++------- .../atxp-client/src/solanaPaymentMaker.ts | 2 +- 5 files changed, 78 insertions(+), 33 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index e30954bd..3890de6e 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -42,6 +42,7 @@ export class BaseAppAccount implements Account { ); } + /* // Initialize storage const baseStorage = config?.storage || new BrowserStorage(); const storage = new IntermediaryStorage(baseStorage); @@ -77,15 +78,20 @@ export class BaseAppAccount implements Account { // Save wallet and permission storage.set(storageKey, {privateKey, permission}); + */ + // TODO: TEMPORARY HACK- USE MAIN ACCOUNT TO PAY //const account = privateKeyToAccount(privateKey); const account = walletClient.account; if (!account) { throw new Error('Account is required'); } - return new BaseAppAccount(baseRPCUrl, permission, account, smartWallet); + console.log('walletClient:', walletClient); + //return new BaseAppAccount(baseRPCUrl, permission, account, smartWallet, logger); + return new BaseAppAccount(baseRPCUrl, walletClient, logger); } + /* private static loadSavedWalletAndPermission( permissionStorage: IntermediaryStorage, storageKey: string @@ -298,6 +304,26 @@ export class BaseAppAccount implements Account { this.paymentMakers = { 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, account, smartWallet, logger), } + }*/ + + constructor( + baseRPCUrl: string, + //account: ViemAccount, + walletClient: WalletClient, + logger?: Logger + ) { + if (!baseRPCUrl) { + throw new Error('Base RPC URL is required'); + } + if (!walletClient) { + throw new Error('Wallet client is required'); + } + + this.accountId = walletClient!.account!.address; + + this.paymentMakers = { + 'base': new BaseAppPaymentMaker(baseRPCUrl, walletClient, logger), + } } /** diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 0263ff20..00429cf0 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,27 +1,28 @@ import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, getAddress, Account } from 'viem'; +import { encodeFunctionData, getAddress, Account, WalletClient } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { - private spendPermission: SpendPermission; - private smartWallet: EphemeralSmartWallet; + //private spendPermission: SpendPermission; + //private smartWallet: EphemeralSmartWallet; constructor( baseRPCUrl: string, - spendPermission: SpendPermission, - account: Account, - smartWallet: EphemeralSmartWallet, + //spendPermission: SpendPermission, + //account: Account, + walletClient: WalletClient, + //smartWallet: EphemeralSmartWallet, logger?: Logger ) { - if (!spendPermission) { - throw new Error('Spend permission is required'); - } - super(baseRPCUrl, account, logger); - this.spendPermission = spendPermission; - this.smartWallet = smartWallet; + //if (!spendPermission) { + //throw new Error('Spend permission is required'); + //} + super(baseRPCUrl, walletClient, logger); + //this.spendPermission = spendPermission; + //this.smartWallet = smartWallet; } diff --git a/packages/atxp-client/src/baseAccount.ts b/packages/atxp-client/src/baseAccount.ts index f375829a..2b4fea3d 100644 --- a/packages/atxp-client/src/baseAccount.ts +++ b/packages/atxp-client/src/baseAccount.ts @@ -1,6 +1,8 @@ import type { Account, PaymentMaker, Hex } from './types.js'; import { privateKeyToAccount } from 'viem/accounts'; import { BasePaymentMaker } from './basePaymentMaker.js'; +import { createWalletClient, http } from 'viem'; +import { base } from 'viem/chains'; export class BaseAccount implements Account { accountId: string; @@ -17,8 +19,13 @@ export class BaseAccount implements Account { const account = privateKeyToAccount(sourceSecretKey); this.accountId = account.address; + const walletClient = createWalletClient({ + account: account, + chain: base, + transport: http(baseRPCUrl), + }); this.paymentMakers = { - 'base': BasePaymentMaker.fromSecretKey(baseRPCUrl, sourceSecretKey), + 'base': new BasePaymentMaker(baseRPCUrl, walletClient), } } } \ No newline at end of file diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index a4475133..fcde6d75 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -66,35 +66,39 @@ const ERC20_ABI = [ export class BasePaymentMaker implements PaymentMaker { protected signingClient: ExtendedWalletClient; - protected account: Account; + //protected account: Account; protected logger: Logger; + /* static fromSecretKey(baseRPCUrl: string, sourceSecretKey: Hex, logger?: Logger): BasePaymentMaker { const account = privateKeyToAccount(sourceSecretKey); return new BasePaymentMaker(baseRPCUrl, account, logger); - } + }*/ - constructor(baseRPCUrl: string, account: Account, logger?: Logger) { + constructor(baseRPCUrl: string, walletClient: WalletClient, logger?: Logger) { if (!baseRPCUrl) { - throw new Error('Base RPC URL is required'); + throw new Error('baseRPCUrl was empty'); + } + if (!walletClient) { + throw new Error('walletClient was empty'); } - if (!account) { - throw new Error('Account is required'); + if(!walletClient.account) { + throw new Error('walletClient.account was empty'); } - this.account = account; - this.signingClient = createWalletClient({ - account: this.account, - chain: base, - transport: http(baseRPCUrl), - }).extend(publicActions) as ExtendedWalletClient; + this.signingClient = walletClient.extend(publicActions) as ExtendedWalletClient; + //this.publicClient = createWalletClient({ + //account: this.account, + //chain: base, + //transport: http(baseRPCUrl), + //}).extend(publicActions) as ExtendedWalletClient; this.logger = logger ?? new ConsoleLogger(); } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { const headerObj = { alg: 'ES256K' }; // this value is specific to Base const payloadObj = { - sub: this.account.address, + sub: this.signingClient.account!.address, iss: 'accounts.atxp.ai', aud: 'https://auth.atxp.ai', iat: Math.floor(Date.now() / 1000), @@ -112,16 +116,23 @@ export class BasePaymentMaker implements PaymentMaker { ? Buffer.from(message, 'utf8') : new TextEncoder().encode(message); const signResult = await this.signingClient.signMessage({ - account: this.account, + account: this.signingClient.account!, message: { raw: messageBytes }, }); + console.log('signResult:', signResult); // The paymcp server expects ES256K signatures as hex strings with 0x prefix // The signResult from viem is already in hex format with 0x prefix (65 bytes) // We encode the hex string itself (including 0x) as base64url const signature = toBase64Url(signResult); - return `${header}.${payload}.${signature}`; + const jwt = `${header}.${payload}.${signature}`; + console.log('Preparing JWT for auth server...'); + console.log('sub:', this.signingClient.account!.address); + console.log('code_challenge:', codeChallenge); + console.log('payment_request_id:', paymentRequestId); + console.log('jwt:', jwt); + return jwt; } async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { @@ -129,7 +140,7 @@ export class BasePaymentMaker implements PaymentMaker { throw new PaymentNetworkErrorClass('Only USDC currency is supported; received ' + currency); } - this.logger.info(`Making payment of ${amount} ${currency} to ${receiver} on Base`); + this.logger.info(`Making payment of ${amount} ${currency} to ${receiver} on Base from ${this.signingClient.account!.address}`); try { // Check balance before attempting payment @@ -137,7 +148,7 @@ export class BasePaymentMaker implements PaymentMaker { address: USDC_CONTRACT_ADDRESS_BASE as Address, abi: ERC20_ABI, functionName: 'balanceOf', - args: [this.account.address], + args: [this.signingClient.account!.address], }) as bigint; const balance = new BigNumber(balanceRaw.toString()).dividedBy(10 ** USDC_DECIMALS); @@ -157,7 +168,7 @@ export class BasePaymentMaker implements PaymentMaker { }); const hash = await this.signingClient.sendTransaction({ chain: base, - account: this.account, + account: this.signingClient.account!, to: USDC_CONTRACT_ADDRESS_BASE, data: data, value: parseEther('0'), diff --git a/packages/atxp-client/src/solanaPaymentMaker.ts b/packages/atxp-client/src/solanaPaymentMaker.ts index 9a3759e2..4f82cabf 100644 --- a/packages/atxp-client/src/solanaPaymentMaker.ts +++ b/packages/atxp-client/src/solanaPaymentMaker.ts @@ -56,7 +56,7 @@ export class SolanaPaymentMaker implements PaymentMaker { const receiverKey = new PublicKey(receiver); - this.logger.info(`Making payment of ${amount} ${currency} to ${receiver} on Solana`); + this.logger.info(`Making payment of ${amount} ${currency} to ${receiver} on Solana from ${this.source.publicKey.toBase58()}`); try { // Check balance before attempting payment From b00f49ddfd25543f0ffb29326c230b3b308302d1 Mon Sep 17 00:00:00 2001 From: bdj Date: Sun, 24 Aug 2025 20:35:40 -0700 Subject: [PATCH 25/53] Despair --- packages/atxp-client/src/basePaymentMaker.ts | 163 ++++++++++++++++++- 1 file changed, 156 insertions(+), 7 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index fcde6d75..b0ab2235 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -12,6 +12,8 @@ import { WalletClient, PublicActions, Account, + decodeAbiParameters, + parseSignature, } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; @@ -30,6 +32,119 @@ function toBase64Url(data: string): string { return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } +// Helper function to convert P-256 public key bytes to PEM format +function p256PublicKeyToPEM(publicKeyBytes: string): string { + // Remove 0x prefix if present + const hex = publicKeyBytes.startsWith('0x') ? publicKeyBytes.slice(2) : publicKeyBytes; + + // P-256 public key should be 64 bytes (128 hex chars) - x and y coordinates + if (hex.length !== 128) { + throw new Error(`Invalid P-256 public key length: expected 128 hex chars, got ${hex.length}`); + } + + // Create the DER encoding for a P-256 public key + // This includes the algorithm identifier and the public key point + const algorithmIdentifier = '3059301306072a8648ce3d020106082a8648ce3d030107034200'; + const fullKey = algorithmIdentifier + '04' + hex; // 04 prefix for uncompressed point + + // Convert to base64 + const keyBytes = Buffer.from(fullKey, 'hex'); + const base64 = keyBytes.toString('base64'); + + // Format as PEM + return `-----BEGIN PUBLIC KEY-----\n${base64.match(/.{1,64}/g)?.join('\n')}\n-----END PUBLIC KEY-----`; +} + +// Helper function to validate extracted signature components +function validateSignatureComponents(r: string, s: string): void { + // Check if r or s are all zeros or have too many leading zeros + const rBigInt = BigInt('0x' + r); + const sBigInt = BigInt('0x' + s); + + if (rBigInt === 0n) { + throw new Error('Invalid signature: r component is zero'); + } + + if (sBigInt === 0n) { + throw new Error('Invalid signature: s component is zero'); + } + + // Check if values are suspiciously small (too many leading zeros) + // A valid signature component should use most of its 32 bytes + const rHex = rBigInt.toString(16); + const sHex = sBigInt.toString(16); + + // If the actual value is less than 16 bytes (32 hex chars), it's suspicious + if (rHex.length < 32) { + throw new Error(`Invalid signature: r component suspiciously small (${rHex.length} hex digits)`); + } + + if (sHex.length < 32) { + throw new Error(`Invalid signature: s component suspiciously small (${sHex.length} hex digits)`); + } + + // Check if r and s are within valid range for P-256 curve + const P256_ORDER = BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'); + + if (rBigInt >= P256_ORDER) { + throw new Error('Invalid signature: r component exceeds P-256 curve order'); + } + + if (sBigInt >= P256_ORDER) { + throw new Error('Invalid signature: s component exceeds P-256 curve order'); + } + + // Check for suspicious patterns (e.g., repeated bytes) + const rPattern = r.match(/(.)\1{15,}/); // 16 or more repeated chars + const sPattern = s.match(/(.)\1{15,}/); + + if (rPattern) { + throw new Error(`Invalid signature: r component has suspicious repeated pattern`); + } + + if (sPattern) { + throw new Error(`Invalid signature: s component has suspicious repeated pattern`); + } +} + +// Helper function to extract ES256 signature from WebAuthn data +function extractSignatureFromWebAuthn(webAuthnSignature: string): string { + console.log('\n=== WebAuthn Signature Extraction ==='); + + const hexData = webAuthnSignature.slice(2); // Remove 0x prefix + console.log('Hex data length (without 0x):', hexData.length); + + // Based on analysis of Coinbase Smart Wallet WebAuthn responses, + // the signature r,s values are consistently at these positions: + const R_OFFSET = 576; // Position where r value starts + const S_OFFSET = 640; // Position where s value starts + const SIGNATURE_COMPONENT_LENGTH = 64; // 32 bytes = 64 hex chars + + // Validate that we have enough data + if (hexData.length < S_OFFSET + SIGNATURE_COMPONENT_LENGTH) { + throw new Error(`WebAuthn response too short: expected at least ${S_OFFSET + SIGNATURE_COMPONENT_LENGTH} chars, got ${hexData.length}`); + } + + // Extract r and s values + const r = hexData.substring(R_OFFSET, R_OFFSET + SIGNATURE_COMPONENT_LENGTH); + const s = hexData.substring(S_OFFSET, S_OFFSET + SIGNATURE_COMPONENT_LENGTH); + + console.log('Extracted signature components:'); + console.log('- r:', r); + console.log('- s:', s); + + // Validate the extracted components with the separate validation function + try { + validateSignatureComponents(r, s); + console.log('Signature validation passed'); + } catch (error) { + console.error('Signature validation failed:', error); + throw error; + } + + return `0x${r}${s}`; +} + export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; const ERC20_ABI = [ @@ -96,7 +211,18 @@ export class BasePaymentMaker implements PaymentMaker { } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { - const headerObj = { alg: 'ES256K' }; // this value is specific to Base + // Use ES256 for WebAuthn compatibility (P-256 curve) + // TODO: Detect wallet type and use ES256K for regular Ethereum wallets + const isWebAuthn = true; // TODO: Detect if using WebAuthn/Coinbase Smart Wallet + const headerObj = { alg: isWebAuthn ? 'ES256' : 'ES256K' }; + + // For WebAuthn with ES256, the server will fetch the P-256 key from the smart wallet + if (isWebAuthn) { + console.log('\n=== WebAuthn Mode ==='); + console.log('Using ES256 algorithm'); + console.log('Server will fetch P-256 key from smart wallet at:', this.signingClient.account!.address); + } + const payloadObj = { sub: this.signingClient.account!.address, iss: 'accounts.atxp.ai', @@ -119,19 +245,42 @@ export class BasePaymentMaker implements PaymentMaker { account: this.signingClient.account!, message: { raw: messageBytes }, }); + console.log('\n=== SignMessage Result ==='); + console.log('signResult type:', typeof signResult); + console.log('signResult length:', signResult.length); console.log('signResult:', signResult); - // The paymcp server expects ES256K signatures as hex strings with 0x prefix - // The signResult from viem is already in hex format with 0x prefix (65 bytes) - // We encode the hex string itself (including 0x) as base64url - const signature = toBase64Url(signResult); + // Extract the actual signature if it's a WebAuthn signature + let signatureRaw: string = signResult as string; + if (signResult.length > 130) { // More than 65 bytes when hex-encoded + console.log('\nDetected WebAuthn signature (length > 130)'); + // This is a WebAuthn signature, extract the r,s values + signatureRaw = extractSignatureFromWebAuthn(signResult); + console.log('\nExtracted signature:', signatureRaw); + } else { + console.log('\nUsing standard signature (length <= 130)'); + } + + // For ES256, we need to encode the raw r||s values (64 bytes) as base64url + // The signature needs to be base64url encoded binary data + let signature: string; + const base64Signature = typeof Buffer !== 'undefined' + ? Buffer.from(signatureRaw).toString('base64') + : btoa(signatureRaw); + // Convert base64 to base64url + signature = base64Signature.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); const jwt = `${header}.${payload}.${signature}`; - console.log('Preparing JWT for auth server...'); + console.log('\n=== Final JWT Construction ==='); + console.log('Algorithm:', headerObj.alg); console.log('sub:', this.signingClient.account!.address); console.log('code_challenge:', codeChallenge); console.log('payment_request_id:', paymentRequestId); - console.log('jwt:', jwt); + console.log('JWT header:', header); + console.log('JWT payload:', payload); + console.log('JWT signature (first 50 chars):', signature.substring(0, 50) + '...'); + console.log('Complete JWT:', jwt); + console.log('=== End JWT Debug ===\n'); return jwt; } From cce6bf1a8b55ea1b599b0077e63c8440a39160a3 Mon Sep 17 00:00:00 2001 From: bdj Date: Sun, 24 Aug 2025 21:53:50 -0700 Subject: [PATCH 26/53] WIP --- packages/atxp-client/src/basePaymentMaker.ts | 150 +++++++++++-------- 1 file changed, 86 insertions(+), 64 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index b0ab2235..d94f6e81 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -211,77 +211,99 @@ export class BasePaymentMaker implements PaymentMaker { } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { - // Use ES256 for WebAuthn compatibility (P-256 curve) - // TODO: Detect wallet type and use ES256K for regular Ethereum wallets + // TODO: Detect wallet type properly const isWebAuthn = true; // TODO: Detect if using WebAuthn/Coinbase Smart Wallet - const headerObj = { alg: isWebAuthn ? 'ES256' : 'ES256K' }; - // For WebAuthn with ES256, the server will fetch the P-256 key from the smart wallet if (isWebAuthn) { - console.log('\n=== WebAuthn Mode ==='); - console.log('Using ES256 algorithm'); - console.log('Server will fetch P-256 key from smart wallet at:', this.signingClient.account!.address); - } - - const payloadObj = { - sub: this.signingClient.account!.address, - iss: 'accounts.atxp.ai', - aud: 'https://auth.atxp.ai', - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 60 * 60, - ...(codeChallenge ? { code_challenge: codeChallenge } : {}), - ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), - } as Record; + // For WebAuthn/Coinbase Smart Wallets, use EIP-1271 instead of JWT + console.log('\n=== EIP-1271 Authentication Mode ==='); + console.log('Using EIP-1271 signature verification for smart wallet'); + + // Create a structured message for signing + const timestamp = Math.floor(Date.now() / 1000); + const nonce = Math.random().toString(36).substring(2, 15); + + const message = `PayMCP Authorization Request - const header = toBase64Url(JSON.stringify(headerObj)); - const payload = toBase64Url(JSON.stringify(payloadObj)); - const message = `${header}.${payload}`; +Wallet: ${this.signingClient.account!.address} +Timestamp: ${timestamp} +Nonce: ${nonce} +${codeChallenge ? `Code Challenge: ${codeChallenge}` : ''} +${paymentRequestId ? `Payment Request ID: ${paymentRequestId}` : ''} - // For Ethereum wallets, we need to use personal_sign format - const messageBytes = typeof Buffer !== 'undefined' - ? Buffer.from(message, 'utf8') - : new TextEncoder().encode(message); - const signResult = await this.signingClient.signMessage({ - account: this.signingClient.account!, - message: { raw: messageBytes }, - }); - console.log('\n=== SignMessage Result ==='); - console.log('signResult type:', typeof signResult); - console.log('signResult length:', signResult.length); - console.log('signResult:', signResult); - - // Extract the actual signature if it's a WebAuthn signature - let signatureRaw: string = signResult as string; - if (signResult.length > 130) { // More than 65 bytes when hex-encoded - console.log('\nDetected WebAuthn signature (length > 130)'); - // This is a WebAuthn signature, extract the r,s values - signatureRaw = extractSignatureFromWebAuthn(signResult); - console.log('\nExtracted signature:', signatureRaw); +Sign this message to prove you control this wallet.`; + + console.log('Message to sign:', message); + + // Sign the message with the wallet (triggers WebAuthn/fingerprint) + const signature = await this.signingClient.signMessage({ + account: this.signingClient.account!, + message: message, + }); + + console.log('Signature (WebAuthn response):', signature.substring(0, 100) + '...'); + + // Create the auth data object + const authData = { + type: 'EIP1271_AUTH', + walletAddress: this.signingClient.account!.address, + message: message, + signature: signature, + timestamp: timestamp, + nonce: nonce, + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), + }; + + // Serialize as base64url for transmission (similar to JWT format) + const serialized = toBase64Url(JSON.stringify(authData)); + console.log('Serialized auth data length:', serialized.length); + console.log('Serialized auth data:', serialized); + + return serialized; } else { - console.log('\nUsing standard signature (length <= 130)'); - } - - // For ES256, we need to encode the raw r||s values (64 bytes) as base64url - // The signature needs to be base64url encoded binary data - let signature: string; - const base64Signature = typeof Buffer !== 'undefined' - ? Buffer.from(signatureRaw).toString('base64') - : btoa(signatureRaw); - // Convert base64 to base64url - signature = base64Signature.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); + // Original JWT logic for regular wallets + const headerObj = { alg: 'ES256K' }; + + const payloadObj = { + sub: this.signingClient.account!.address, + iss: 'accounts.atxp.ai', + aud: 'https://auth.atxp.ai', + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 60 * 60, + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), + } as Record; + + const header = toBase64Url(JSON.stringify(headerObj)); + const payload = toBase64Url(JSON.stringify(payloadObj)); + const message = `${header}.${payload}`; + + const messageBytes = typeof Buffer !== 'undefined' + ? Buffer.from(message, 'utf8') + : new TextEncoder().encode(message); + + const signResult = await this.signingClient.signMessage({ + account: this.signingClient.account!, + message: { raw: messageBytes }, + }); - const jwt = `${header}.${payload}.${signature}`; - console.log('\n=== Final JWT Construction ==='); - console.log('Algorithm:', headerObj.alg); - console.log('sub:', this.signingClient.account!.address); - console.log('code_challenge:', codeChallenge); - console.log('payment_request_id:', paymentRequestId); - console.log('JWT header:', header); - console.log('JWT payload:', payload); - console.log('JWT signature (first 50 chars):', signature.substring(0, 50) + '...'); - console.log('Complete JWT:', jwt); - console.log('=== End JWT Debug ===\n'); - return jwt; + // For ES256K, signature is typically 65 bytes (r,s,v) + let signature: string; + if (typeof Buffer !== 'undefined') { + signature = Buffer.from(signResult.slice(2), 'hex').toString('base64url'); + } else { + // Browser environment + const hexStr = signResult.slice(2); + const bytes = new Uint8Array(hexStr.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16))); + const base64 = btoa(String.fromCharCode(...bytes)); + signature = base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); + } + + const jwt = `${header}.${payload}.${signature}`; + console.log('Generated ES256K JWT:', jwt); + return jwt; + } } async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { From bb4f58cf23dea90fc7cdd8089d1083e85a7085d3 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 09:03:42 -0700 Subject: [PATCH 27/53] Comment-out unused code in basePaymentMaker --- packages/atxp-client/src/basePaymentMaker.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index d94f6e81..7f8b065c 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -4,16 +4,16 @@ import { Logger, Currency } from '@atxp/common'; import { ConsoleLogger } from '@atxp/common'; import { Address, - createWalletClient, - http, + //createWalletClient, + //http, parseEther, publicActions, encodeFunctionData, WalletClient, PublicActions, - Account, - decodeAbiParameters, - parseSignature, + //Account, + //decodeAbiParameters, + //parseSignature, } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; @@ -31,7 +31,7 @@ function toBase64Url(data: string): string { // Convert base64 to base64url return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } - +/* // Helper function to convert P-256 public key bytes to PEM format function p256PublicKeyToPEM(publicKeyBytes: string): string { // Remove 0x prefix if present @@ -144,6 +144,7 @@ function extractSignatureFromWebAuthn(webAuthnSignature: string): string { return `0x${r}${s}`; } + */ export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; From 6a8c266cb05ca344c2314172634351182cfe6c71 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 09:13:40 -0700 Subject: [PATCH 28/53] Restore tsconfigs --- package.json | 3 +-- packages/atxp-client/tsconfig.json | 12 ++++-------- packages/atxp-common/tsconfig.json | 14 +++++--------- tsconfig.json | 10 +++------- 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 41b8b665..fb1a9e9c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "dev:cli": "npm run build && npm run build:dev && node dist/cli.js" }, "dependencies": { - "@base-org/account": "^2.0.2", "dotenv": "^16.5.0" }, "devDependencies": { @@ -53,7 +52,7 @@ "node-mocks-http": "^1.17.2", "supertest": "^7.1.4", "tsx": "^4.19.2", - "typescript": "^5.5.3", + "typescript": "^5.7.3", "vitest": "^3.0.9" } } diff --git a/packages/atxp-client/tsconfig.json b/packages/atxp-client/tsconfig.json index 0e38511d..36aa2bd1 100644 --- a/packages/atxp-client/tsconfig.json +++ b/packages/atxp-client/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2020", "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["ES2022", "DOM"], + "moduleResolution": "node", + "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", "strict": true, @@ -15,11 +15,7 @@ "declarationMap": true, "sourceMap": true, "allowSyntheticDefaultImports": true, - "composite": true, - "allowImportingTsExtensions": false, - "noEmit": false, - "exactOptionalPropertyTypes": false, - "noUncheckedIndexedAccess": false + "composite": true }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"], diff --git a/packages/atxp-common/tsconfig.json b/packages/atxp-common/tsconfig.json index e3e25e4b..9a7d3d37 100644 --- a/packages/atxp-common/tsconfig.json +++ b/packages/atxp-common/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2020", "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["ES2022", "DOM"], + "moduleResolution": "node", + "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", "strict": true, @@ -15,12 +15,8 @@ "declarationMap": true, "sourceMap": true, "allowSyntheticDefaultImports": true, - "composite": true, - "allowImportingTsExtensions": false, - "noEmit": false, - "exactOptionalPropertyTypes": false, - "noUncheckedIndexedAccess": false + "composite": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"] + "exclude": ["node_modules", "dist", "**/*.test.ts"] } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index ee5c778d..658e5e0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2020", "module": "ESNext", - "lib": ["ES2022", "DOM"], + "lib": ["ES2020", "DOM"], "outDir": "./dist", "strict": true, "esModuleInterop": true, @@ -11,11 +11,7 @@ "resolveJsonModule": true, "moduleResolution": "bundler", "declaration": false, - "allowSyntheticDefaultImports": true, - "allowImportingTsExtensions": false, - "noEmit": false, - "exactOptionalPropertyTypes": false, - "noUncheckedIndexedAccess": false + "allowSyntheticDefaultImports": true }, "include": ["src/dev/**/*.ts"], "exclude": ["node_modules", "dist", "examples", "packages"] From 5b2de8240870efb383513ed5acb6e75a754fb0a7 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 09:29:46 -0700 Subject: [PATCH 29/53] Comment out code to get clean build without ox dep TS build issue --- package-lock.json | 191 +---------------- packages/atxp-base/package.json | 2 - packages/atxp-base/src/baseAppAccount.ts | 2 +- packages/atxp-base/src/baseAppPaymentMaker.ts | 2 +- packages/atxp-base/src/smartWalletHelpers.ts | 196 +++++++++--------- packages/atxp-base/tsconfig.json | 14 +- 6 files changed, 109 insertions(+), 298 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1dd543d1..2ec68b5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "packages/atxp-base" ], "dependencies": { - "@base-org/account": "^2.0.2", "dotenv": "^16.5.0" }, "devDependencies": { @@ -33,7 +32,7 @@ "node-mocks-http": "^1.17.2", "supertest": "^7.1.4", "tsx": "^4.19.2", - "typescript": "^5.5.3", + "typescript": "^5.7.3", "vitest": "^3.0.9" } }, @@ -52,16 +51,6 @@ } } }, - "node_modules/@account-abstraction/contracts": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.8.0.tgz", - "integrity": "sha512-8krPx/gpnoT+5xAroagVCbeA7FbUigMZWXFKKPm+oghyr29Dksssdx5sI7xGv9212i4JPaDDUGFk58dpuwVgHA==", - "license": "MIT", - "dependencies": { - "@openzeppelin/contracts": "^5.1.0", - "@uniswap/v3-periphery": "^1.4.3" - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", @@ -1830,75 +1819,6 @@ "node": ">=6.9.0" } }, - "node_modules/@base-org/account": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.0.2.tgz", - "integrity": "sha512-p/mefIVfiKxDYWIoZSp1VeCXmh3hqmaD8ThS7YKMnuxljfM6dOJTxvUpZ/emkXvQQa1nnCA+TRVZt1nCrs5ACA==", - "license": "Apache-2.0", - "dependencies": { - "@noble/hashes": "1.4.0", - "clsx": "1.2.1", - "eventemitter3": "5.0.1", - "idb-keyval": "6.2.1", - "ox": "0.6.9", - "preact": "10.24.2", - "viem": "^2.31.7", - "zustand": "5.0.3" - } - }, - "node_modules/@base-org/account/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@base-org/account/node_modules/ox": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", - "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.10.1", - "@noble/curves": "^1.6.0", - "@noble/hashes": "^1.5.0", - "@scure/bip32": "^1.5.0", - "@scure/bip39": "^1.4.0", - "abitype": "^1.0.6", - "eventemitter3": "5.0.1" - }, - "peerDependencies": { - "typescript": ">=5.4.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@base-org/account/node_modules/ox/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -3687,12 +3607,6 @@ "node": ">= 8" } }, - "node_modules/@openzeppelin/contracts": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.4.0.tgz", - "integrity": "sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A==", - "license": "MIT" - }, "node_modules/@paralleldrive/cuid2": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", @@ -5470,55 +5384,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@uniswap/lib": { - "version": "4.0.1-alpha", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", - "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", - "license": "GPL-3.0-or-later", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v2-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", - "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", - "license": "GPL-3.0-or-later", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", - "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", - "license": "BUSL-1.1", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-periphery": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz", - "integrity": "sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==", - "license": "GPL-2.0-or-later", - "dependencies": { - "@openzeppelin/contracts": "3.4.2-solc-0.7", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "^1.0.1", - "@uniswap/v3-core": "^1.0.0", - "base64-sol": "1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==", - "license": "MIT" - }, "node_modules/@urql/core": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", @@ -6309,12 +6174,6 @@ ], "license": "MIT" }, - "node_modules/base64-sol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", - "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==", - "license": "MIT" - }, "node_modules/better-opn": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", @@ -6942,15 +6801,6 @@ "node": ">=0.8" } }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9683,12 +9533,6 @@ "node": ">=0.10.0" } }, - "node_modules/idb-keyval": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", - "license": "Apache-2.0" - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -12812,6 +12656,7 @@ }, <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) "node_modules/preact": { @@ -12867,6 +12712,8 @@ >>>>>>> 4eb82d9 (Use minikit for wallet access instead of base-org/account API) ======= >>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) +======= +>>>>>>> 2ace185 (Comment out code to get clean build without ox dep TS build issue) "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16455,41 +16302,11 @@ "zod": "^3.24.1" } }, - "node_modules/zustand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", - "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, "packages/atxp-base": { "name": "@atxp/base", "version": "0.2.10", "license": "MIT", "dependencies": { - "@account-abstraction/contracts": "^0.8.0", "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "bignumber.js": "^9.3.0", diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index 3e7091d3..85c835f4 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -22,11 +22,9 @@ "test": "vitest run" }, "dependencies": { - "@account-abstraction/contracts": "^0.8.0", "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", "bignumber.js": "^9.3.0", - "viem": "^2.34.0" }, "devDependencies": { diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 3890de6e..2758a652 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -7,7 +7,7 @@ import { getAddress, createPublicClient, http, Account as ViemAccount } from 'vi import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; -import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +// import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { Logger } from '@atxp/common'; const DEFAULT_ALLOWANCE = 10n; diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 00429cf0..9a9f64f9 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -3,7 +3,7 @@ import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; import { encodeFunctionData, getAddress, Account, WalletClient } from 'viem'; import { SpendPermission } from './types.js'; -import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; +// import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { //private spendPermission: SpendPermission; diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index 7bd2c62b..64470ab0 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -1,103 +1,103 @@ -import { - http, - createPublicClient, - type Account, - type Address, - type LocalAccount, -} from 'viem'; -import { base } from 'viem/chains'; -import { privateKeyToAccount } from 'viem/accounts'; -import { - toCoinbaseSmartAccount, - createBundlerClient, - createPaymasterClient, - type BundlerClient, - type SmartAccount -} from 'viem/account-abstraction'; +// import { +// http, +// createPublicClient, +// type Account, +// type Address, +// type LocalAccount, +// } from 'viem'; +// import { base } from 'viem/chains'; +// import { privateKeyToAccount } from 'viem/accounts'; +// import { +// toCoinbaseSmartAccount, +// createBundlerClient, +// createPaymasterClient, +// type BundlerClient, +// type SmartAccount +// } from 'viem/account-abstraction'; // Coinbase CDP Paymaster and Bundler endpoints -const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +// const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +// const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -export interface EphemeralSmartWallet { - address: Address; - client: BundlerClient; - account: SmartAccount; - signer: Account; -} +// export interface EphemeralSmartWallet { +// address: Address; +// client: BundlerClient; +// account: SmartAccount; +// signer: Account; +// } -/** - * Creates an ephemeral smart wallet with paymaster support - */ -export async function toEphemeralSmartWallet( - privateKey: `0x${string}`, - apiKey: string -): Promise { - const signer = privateKeyToAccount(privateKey); - - const publicClient = createPublicClient({ - chain: base, - transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) - }); - - // Create the Coinbase smart wallet - const account = await toCoinbaseSmartAccount({ - client: publicClient, - owners: [signer], - version: '1' - }); - - // Create bundler client with paymaster support - const bundlerClient = createBundlerClient({ - account, - client: publicClient, - transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), - chain: base, - paymaster: true, // Enable paymaster sponsorship - paymasterContext: { - transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) - } - }); - - return { - address: account.address, - client: bundlerClient, - account, - signer, - }; -} +// /** +// * Creates an ephemeral smart wallet with paymaster support +// */ +// export async function toEphemeralSmartWallet( +// privateKey: `0x${string}`, +// apiKey: string +// ): Promise { +// const signer = privateKeyToAccount(privateKey); +// +// const publicClient = createPublicClient({ +// chain: base, +// transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) +// }); +// +// // Create the Coinbase smart wallet +// const account = await toCoinbaseSmartAccount({ +// client: publicClient, +// owners: [signer], +// version: '1' +// }); +// +// // Create bundler client with paymaster support +// const bundlerClient = createBundlerClient({ +// account, +// client: publicClient, +// transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), +// chain: base, +// paymaster: true, // Enable paymaster sponsorship +// paymasterContext: { +// transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) +// } +// }); +// +// return { +// address: account.address, +// client: bundlerClient, +// account, +// signer, +// }; +// } -/** - * Gets the counterfactual address for a smart wallet without deploying it - */ -/*export async function getSmartWalletAddress( - signerOrPrivateKey: Address | `0x${string}`, - apiKey: string -): Promise
{ - const publicClient = createPublicClient({ - chain: base, - transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) - }); - - // Check if we received a private key or just an address - let owner: LocalAccount; - if (signerOrPrivateKey.length === 66) { - // It's a private key - owner = privateKeyToAccount(signerOrPrivateKey as `0x${string}`); - } else { - // It's just an address - we need to return a placeholder - // since we can't create a valid account without a private key - // This is a limitation of the current Coinbase Smart Wallet implementation - console.warn('Cannot compute exact smart wallet address without private key. Using placeholder.'); - // Return a deterministic but placeholder address - return `0x${'0'.repeat(38)}${signerOrPrivateKey.slice(-2)}` as Address; - } - - const smartAccount = await toCoinbaseSmartAccount({ - client: publicClient, - owners: [owner], - version: '1' - }); - - return smartAccount.address; -}*/ \ No newline at end of file +// /** +// * Gets the counterfactual address for a smart wallet without deploying it +// */ +// /*export async function getSmartWalletAddress( +// signerOrPrivateKey: Address | `0x${string}`, +// apiKey: string +// ): Promise
{ +// const publicClient = createPublicClient({ +// chain: base, +// transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) +// }); +// +// // Check if we received a private key or just an address +// let owner: LocalAccount; +// if (signerOrPrivateKey.length === 66) { +// // It's a private key +// owner = privateKeyToAccount(signerOrPrivateKey as `0x${string}`); +// } else { +// // It's just an address - we need to return a placeholder +// // since we can't create a valid account without a private key +// // This is a limitation of the current Coinbase Smart Wallet implementation +// console.warn('Cannot compute exact smart wallet address without private key. Using placeholder.'); +// // Return a deterministic but placeholder address +// return `0x${'0'.repeat(38)}${signerOrPrivateKey.slice(-2)}` as Address; +// } +// +// const smartAccount = await toCoinbaseSmartAccount({ +// client: publicClient, +// owners: [owner], +// version: '1' +// }); +// +// return smartAccount.address; +// }*/ \ No newline at end of file diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index 0e38511d..d85cdb19 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { - "target": "ES2022", + "target": "ES2020", "module": "ESNext", - "moduleResolution": "bundler", - "lib": ["ES2022", "DOM"], + "moduleResolution": "node", + "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", "strict": true, @@ -15,14 +15,10 @@ "declarationMap": true, "sourceMap": true, "allowSyntheticDefaultImports": true, - "composite": true, - "allowImportingTsExtensions": false, - "noEmit": false, - "exactOptionalPropertyTypes": false, - "noUncheckedIndexedAccess": false + "composite": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.expo.test.ts"], + "exclude": ["node_modules", "dist", "**/*.test.ts"], "references": [ { "path": "../atxp-common" } ] From a16986e8ca2c9b6f3ffc2cbc0e7eb82f4a57a8c9 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 11:34:02 -0700 Subject: [PATCH 30/53] More consistent message format --- packages/atxp-client/src/basePaymentMaker.ts | 28 +++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 7f8b065c..40ff475e 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -224,15 +224,25 @@ export class BasePaymentMaker implements PaymentMaker { const timestamp = Math.floor(Date.now() / 1000); const nonce = Math.random().toString(36).substring(2, 15); - const message = `PayMCP Authorization Request - -Wallet: ${this.signingClient.account!.address} -Timestamp: ${timestamp} -Nonce: ${nonce} -${codeChallenge ? `Code Challenge: ${codeChallenge}` : ''} -${paymentRequestId ? `Payment Request ID: ${paymentRequestId}` : ''} - -Sign this message to prove you control this wallet.`; + const messageParts = [ + 'PayMCP Authorization Request', + '', + `Wallet: ${this.signingClient.account!.address}`, + `Timestamp: ${timestamp}`, + `Nonce: ${nonce}` + ]; + + if (codeChallenge) { + messageParts.push(`Code Challenge: ${codeChallenge}`); + } + + if (paymentRequestId) { + messageParts.push(`Payment Request ID: ${paymentRequestId}`); + } + + messageParts.push('', '', 'Sign this message to prove you control this wallet.'); + + const message = messageParts.join('\n'); console.log('Message to sign:', message); From 3010d7bd141f9c969a2c5e501b329b586e06f6aa Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 13:39:22 -0700 Subject: [PATCH 31/53] Paymaster attempt --- packages/atxp-base/src/baseAppAccount.ts | 27 +++--- packages/atxp-base/src/baseAppPaymentMaker.ts | 84 +++++++++++++++++-- packages/atxp-base/src/index.ts | 4 + packages/atxp-base/src/paymasterHelpers.ts | 76 +++++++++++++++++ 4 files changed, 174 insertions(+), 17 deletions(-) create mode 100644 packages/atxp-base/src/paymasterHelpers.ts diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 2758a652..e49d6f6c 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -8,6 +8,7 @@ import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; // import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { createPaymasterSmartWallet, type PaymasterSmartWallet } from './paymasterHelpers.js'; import { Logger } from '@atxp/common'; const DEFAULT_ALLOWANCE = 10n; @@ -16,6 +17,7 @@ const DEFAULT_PERIOD_IN_DAYS = 7; export class BaseAppAccount implements Account { accountId: string; paymentMakers: { [key: string]: PaymentMaker }; + private smartWallet?: PaymasterSmartWallet; private static toStorageKey(userWalletAddress: string): string { return `atxp-base-permission-${userWalletAddress}`; @@ -31,6 +33,7 @@ export class BaseAppAccount implements Account { periodInDays?: number; storage?: IStorage; apiKey: string; + usePaymaster?: boolean; // Defaults to true - set to false to disable paymaster sponsorship }, logger?: Logger, ): Promise { @@ -80,15 +83,14 @@ export class BaseAppAccount implements Account { */ - // TODO: TEMPORARY HACK- USE MAIN ACCOUNT TO PAY - //const account = privateKeyToAccount(privateKey); - const account = walletClient.account; - if (!account) { - throw new Error('Account is required'); + // Create paymaster smart wallet if enabled (defaults to true) + let smartWallet: PaymasterSmartWallet | undefined; + if (config.usePaymaster !== false) { + smartWallet = await createPaymasterSmartWallet(walletClient, config.apiKey); + console.log('Created smart wallet with paymaster at:', smartWallet.address); } - console.log('walletClient:', walletClient); - //return new BaseAppAccount(baseRPCUrl, permission, account, smartWallet, logger); - return new BaseAppAccount(baseRPCUrl, walletClient, logger); + + return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, smartWallet, logger); } /* @@ -115,7 +117,7 @@ export class BaseAppAccount implements Account { userWalletAddress: string, walletClient: WalletClient ): Promise { - const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); + const USDC_CONTRACT = getAddress(USDC_CONTRACT_ADDRESS_BASE); const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); const publicClient = createPublicClient({ @@ -310,6 +312,8 @@ export class BaseAppAccount implements Account { baseRPCUrl: string, //account: ViemAccount, walletClient: WalletClient, + apiKey: string, + smartWallet?: PaymasterSmartWallet, logger?: Logger ) { if (!baseRPCUrl) { @@ -319,10 +323,11 @@ export class BaseAppAccount implements Account { throw new Error('Wallet client is required'); } - this.accountId = walletClient!.account!.address; + this.accountId = smartWallet ? smartWallet.address : walletClient!.account!.address; + this.smartWallet = smartWallet; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, walletClient, logger), + 'base': new BaseAppPaymentMaker(baseRPCUrl, walletClient, smartWallet, logger), } } diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 9a9f64f9..513d6c0e 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,20 +1,19 @@ -import { BasePaymentMaker } from '@atxp/client'; +import { BasePaymentMaker, USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; import { encodeFunctionData, getAddress, Account, WalletClient } from 'viem'; import { SpendPermission } from './types.js'; -// import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { type PaymasterSmartWallet } from './paymasterHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { - //private spendPermission: SpendPermission; - //private smartWallet: EphemeralSmartWallet; + private smartWallet?: PaymasterSmartWallet; constructor( baseRPCUrl: string, //spendPermission: SpendPermission, //account: Account, walletClient: WalletClient, - //smartWallet: EphemeralSmartWallet, + smartWallet?: PaymasterSmartWallet, logger?: Logger ) { //if (!spendPermission) { @@ -22,7 +21,80 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { //} super(baseRPCUrl, walletClient, logger); //this.spendPermission = spendPermission; - //this.smartWallet = smartWallet; + this.smartWallet = smartWallet; + } + + // Override makePayment to use paymaster smart wallet when available + async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { + // If no smart wallet, use regular payment from parent class + if (!this.smartWallet) { + return super.makePayment(amount, currency, receiver); + } + + // Use paymaster-sponsored transaction + if (currency !== 'USDC') { + throw new Error('Only USDC currency is supported; received ' + currency); + } + + const amountBigInt = this.convertAmountToBigInt(amount); + + this.logger.info(`Making paymaster-sponsored payment of ${amount} ${currency} to ${receiver} on Base`); + + return await this.executePaymasterTransaction(amountBigInt, receiver); + } + + private convertAmountToBigInt(amount: BigNumber): bigint { + // Convert USDC amount to its smallest unit (6 decimals) + const USDC_DECIMALS = 6; + const amountInMicroUsdc = amount.multipliedBy(10 ** USDC_DECIMALS); + return BigInt(amountInMicroUsdc.toFixed(0)); + } + + private async executePaymasterTransaction(amountBigInt: bigint, receiver: string): Promise { + + // Prepare USDC transfer call + const transferCalldata = encodeFunctionData({ + abi: [{ + inputs: [ + { name: 'to', type: 'address' }, + { name: 'amount', type: 'uint256' } + ], + name: 'transfer', + outputs: [{ name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + }], + functionName: 'transfer', + args: [receiver as `0x${string}`, amountBigInt] + }); + + try { + // Send user operation with paymaster sponsorship + const userOpHash = await this.smartWallet!.bundlerClient.sendUserOperation({ + calls: [{ + to: USDC_CONTRACT_ADDRESS_BASE, + data: transferCalldata, + value: 0n + }], + }); + + this.logger.info(`Paymaster-sponsored UserOperation sent: ${userOpHash}`); + + // Wait for the operation to be confirmed + const receipt = await this.smartWallet!.bundlerClient.waitForUserOperationReceipt({ + hash: userOpHash + }); + + if (!receipt.success) { + throw new Error(`UserOperation failed: ${userOpHash}`); + } + + this.logger.info(`Paymaster-sponsored payment confirmed: ${receipt.receipt.transactionHash}`); + return receipt.receipt.transactionHash; + } catch (error) { + console.error('Paymaster transaction failed:', error); + throw error; + } } diff --git a/packages/atxp-base/src/index.ts b/packages/atxp-base/src/index.ts index 3c010df6..f28231ee 100644 --- a/packages/atxp-base/src/index.ts +++ b/packages/atxp-base/src/index.ts @@ -8,3 +8,7 @@ export { BrowserStorage, MemoryStorage } from './storage.js'; +export { + createPaymasterSmartWallet, + type PaymasterSmartWallet +} from './paymasterHelpers.js'; diff --git a/packages/atxp-base/src/paymasterHelpers.ts b/packages/atxp-base/src/paymasterHelpers.ts new file mode 100644 index 00000000..54634139 --- /dev/null +++ b/packages/atxp-base/src/paymasterHelpers.ts @@ -0,0 +1,76 @@ +import { + http, + createPublicClient, + type Account, + type Address, + type WalletClient, +} from 'viem'; +import { base } from 'viem/chains'; +import { + toCoinbaseSmartAccount, + createBundlerClient, + createPaymasterClient, + type BundlerClient, + type SmartAccount, + type PaymasterClient +} from 'viem/account-abstraction'; + +// Coinbase CDP endpoints +const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; + +export interface PaymasterSmartWallet { + address: Address; + bundlerClient: BundlerClient; + paymasterClient: PaymasterClient; + account: SmartAccount; +} + +/** + * Creates a smart wallet with paymaster support for sponsored transactions + * @param walletClient - The wallet client with the account that will own the smart wallet + * @param apiKey - Coinbase CDP API key for paymaster services + * @returns PaymasterSmartWallet with bundler and paymaster clients configured + */ +export async function createPaymasterSmartWallet( + walletClient: WalletClient, + apiKey: string +): Promise { + if (!walletClient.account) { + throw new Error('Wallet client must have an account'); + } + + const publicClient = createPublicClient({ + chain: base, + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) + }); + + // Create the Coinbase smart wallet + const account = await toCoinbaseSmartAccount({ + client: publicClient, + owners: [walletClient.account as any], // The account from WalletClient should work here + version: '1', + }); + + // Create paymaster client + const paymasterClient = createPaymasterClient({ + transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) + }); + + // Create bundler client with paymaster support + const bundlerClient = createBundlerClient({ + account, + client: publicClient, + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), + chain: base, + paymaster: paymasterClient, + }); + + return { + address: account.address, + bundlerClient, + paymasterClient, + account, + }; +} + From a7d7c1704ac190523d9d3309ac66e7b7e835d36f Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 13:39:30 -0700 Subject: [PATCH 32/53] Cleanup --- packages/atxp-base/src/baseAppAccount.ts | 15 +-- .../atxp-base/src/baseAppPaymentMaker.test.ts | 101 +++++++----------- packages/atxp-base/src/baseAppPaymentMaker.ts | 7 +- packages/atxp-base/src/paymasterHelpers.ts | 4 +- packages/atxp-base/tsconfig.json | 2 +- ...basePaymentMaker.insufficientFunds.test.ts | 26 ++++- .../atxp-client/src/basePaymentMaker.test.ts | 21 ++-- packages/atxp-client/src/basePaymentMaker.ts | 22 ++-- 8 files changed, 97 insertions(+), 101 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index e49d6f6c..6707d938 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -1,18 +1,13 @@ import type { Account, PaymentMaker } from '@atxp/client'; -import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; -import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; import type { WalletClient } from 'viem'; -import { getAddress, createPublicClient, http, Account as ViemAccount } from 'viem'; -import { base } from 'viem/chains'; -import { SpendPermission } from './types.js'; -import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; +import { IStorage, BrowserStorage } from './storage.js'; // import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { createPaymasterSmartWallet, type PaymasterSmartWallet } from './paymasterHelpers.js'; import { Logger } from '@atxp/common'; -const DEFAULT_ALLOWANCE = 10n; -const DEFAULT_PERIOD_IN_DAYS = 7; +// const DEFAULT_ALLOWANCE = 10n; +// const DEFAULT_PERIOD_IN_DAYS = 7; export class BaseAppAccount implements Account { accountId: string; @@ -87,7 +82,7 @@ export class BaseAppAccount implements Account { let smartWallet: PaymasterSmartWallet | undefined; if (config.usePaymaster !== false) { smartWallet = await createPaymasterSmartWallet(walletClient, config.apiKey); - console.log('Created smart wallet with paymaster at:', smartWallet.address); + logger?.info(`Created smart wallet with paymaster at: ${smartWallet.address}`); } return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, smartWallet, logger); @@ -343,6 +338,6 @@ export class BaseAppAccount implements Account { storage = storage || new BrowserStorage(); storage.delete(this.toStorageKey(userWalletAddress)); - console.log(`All ATXP-related data cleared from storage for ${userWalletAddress}`); + // Data cleared from storage } } \ No newline at end of file diff --git a/packages/atxp-base/src/baseAppPaymentMaker.test.ts b/packages/atxp-base/src/baseAppPaymentMaker.test.ts index 769f8527..1ff664d6 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.test.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.test.ts @@ -1,80 +1,55 @@ import { describe, it, expect } from 'vitest'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; +import { createWalletClient, http } from 'viem'; +import { base } from 'viem/chains'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; -import { SpendPermission } from './types.js'; - -const FAKE_PERMISSION: SpendPermission = { - signature: '0x123', - permission: { - account: '0x123', - spender: '0x123', - token: '0x123', - allowance: 10n.toString(), - period: 7, - start: 1000000000000000000, - end: 1000000000000000000, - salt: '0', - extraData: '0x123', - } -}; - -const FAKE_API_KEY = 'test-api-key'; +// import { SpendPermission } from './types.js'; describe('basePaymentMaker.generateJWT', () => { - it('should generate a valid JWT with default payload', async () => { + it('should generate EIP-1271 auth data with default payload', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_API_KEY); - const jwt = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); - - // JWT format: header.payload.signature (all base64url) - const [headerB64, payloadB64, signatureB64] = jwt.split('.'); - expect(headerB64).toBeDefined(); - expect(payloadB64).toBeDefined(); - expect(signatureB64).toBeDefined(); - - // Decode header and payload - const decodeB64Url = (str: string) => { - // Pad string for base64 decoding - let b64 = str.replace(/-/g, '+').replace(/_/g, '/'); - while (b64.length % 4) b64 += '='; - return JSON.parse(Buffer.from(b64, 'base64').toString('utf-8')); - }; - const header = decodeB64Url(headerB64); - const payload = decodeB64Url(payloadB64); + const walletClient = createWalletClient({ + account, + chain: base, + transport: http('https://example.com') + }); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', walletClient); + const authData = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); + + // Should return base64-encoded EIP-1271 auth data + expect(authData).toBeDefined(); + expect(typeof authData).toBe('string'); + + // Decode and verify the auth data + const decoded = JSON.parse(Buffer.from(authData, 'base64').toString('utf-8')); + expect(decoded.type).toBe('EIP1271_AUTH'); + expect(decoded.walletAddress).toBe(account.address); + expect(decoded.message).toContain('PayMCP Authorization Request'); + expect(decoded.signature).toBeDefined(); + expect(decoded.timestamp).toBeDefined(); + expect(decoded.nonce).toBeDefined(); + expect(decoded.code_challenge).toBe('testCodeChallenge'); - expect(header.alg).toBe('ES256K'); - expect(header.typ).toBeUndefined(); // BasePaymentMaker doesn't set typ - expect(payload.sub).toBe(account.address); - expect(payload.iss).toBe('accounts.atxp.ai'); - expect(payload.aud).toBe('https://auth.atxp.ai'); - expect(typeof payload.iat).toBe('number'); - expect(payload.paymentIds).toBeUndefined(); - // Signature verification would require ES256K (secp256k1) verification - // which is different from the EdDSA verification used in SolanaPaymentMaker - // For now, we just verify the signature is present and properly formatted - expect(signatureB64).toBeDefined(); - expect(signatureB64.length).toBeGreaterThan(0); - - // Decode the signature to verify it's a hex string with 0x prefix - const decodedSig = Buffer.from(signatureB64, 'base64url').toString('utf8'); - expect(decodedSig).toMatch(/^0x[a-fA-F0-9]+$/); }); it('should include payment request id if provided', async () => { const privateKey = generatePrivateKey(); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', FAKE_PERMISSION, privateKey, FAKE_API_KEY); + const account = privateKeyToAccount(privateKey); + const walletClient = createWalletClient({ + account, + chain: base, + transport: http('https://example.com') + }); + const paymentMaker = new BaseAppPaymentMaker('https://example.com', walletClient); const paymentRequestId = 'id1'; - const jwt = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); - const [, payloadB64] = jwt.split('.'); - const decodeB64Url = (str: string) => { - let b64 = str.replace(/-/g, '+').replace(/_/g, '/'); - while (b64.length % 4) b64 += '='; - return JSON.parse(Buffer.from(b64, 'base64').toString('utf-8')); - }; - const payload = decodeB64Url(payloadB64); - expect(payload.payment_request_id).toEqual(paymentRequestId); + const authData = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); + + // Decode and verify the auth data includes payment request ID + const decoded = JSON.parse(Buffer.from(authData, 'base64').toString('utf-8')); + expect(decoded.payment_request_id).toEqual(paymentRequestId); + expect(decoded.message).toContain(`Payment Request ID: ${paymentRequestId}`); }); }); diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 513d6c0e..2d01765a 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,8 +1,8 @@ import { BasePaymentMaker, USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, getAddress, Account, WalletClient } from 'viem'; -import { SpendPermission } from './types.js'; +import { encodeFunctionData, /*getAddress, Account,*/ WalletClient } from 'viem'; +//import { SpendPermission } from './types.js'; import { type PaymasterSmartWallet } from './paymasterHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { @@ -22,6 +22,7 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { super(baseRPCUrl, walletClient, logger); //this.spendPermission = spendPermission; this.smartWallet = smartWallet; + this.isWebAuthn = true; // BaseAppPaymentMaker uses WebAuthn/Smart Wallet auth } // Override makePayment to use paymaster smart wallet when available @@ -92,7 +93,7 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { this.logger.info(`Paymaster-sponsored payment confirmed: ${receipt.receipt.transactionHash}`); return receipt.receipt.transactionHash; } catch (error) { - console.error('Paymaster transaction failed:', error); + this.logger.error(`Paymaster transaction failed: ${error}`); throw error; } } diff --git a/packages/atxp-base/src/paymasterHelpers.ts b/packages/atxp-base/src/paymasterHelpers.ts index 54634139..80e09f8a 100644 --- a/packages/atxp-base/src/paymasterHelpers.ts +++ b/packages/atxp-base/src/paymasterHelpers.ts @@ -1,7 +1,6 @@ import { http, createPublicClient, - type Account, type Address, type WalletClient, } from 'viem'; @@ -48,7 +47,8 @@ export async function createPaymasterSmartWallet( // Create the Coinbase smart wallet const account = await toCoinbaseSmartAccount({ client: publicClient, - owners: [walletClient.account as any], // The account from WalletClient should work here + // eslint-disable-next-line @typescript-eslint/no-explicit-any + owners: [walletClient.account as any], // Type mismatch between viem Account types version: '1', }); diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index d85cdb19..2d614886 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2020", "module": "ESNext", - "moduleResolution": "node", + "moduleResolution": "bundler", "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", diff --git a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts index 8f1d2820..f3cbe0fb 100644 --- a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts +++ b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts @@ -2,11 +2,20 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { BasePaymentMaker } from './basePaymentMaker.js'; import { InsufficientFundsError, PaymentNetworkError } from './types.js'; import { BigNumber } from 'bignumber.js'; +import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; +import { createWalletClient, http } from 'viem'; +import { base } from 'viem/chains'; // Mock viem functions vi.mock('viem', () => ({ createWalletClient: vi.fn(() => ({ + account: { + address: '0xtest-address', + }, extend: vi.fn(() => ({ + account: { + address: '0xtest-address', + }, signMessage: vi.fn(), sendTransaction: vi.fn(), waitForTransactionReceipt: vi.fn(), @@ -46,19 +55,28 @@ describe('BasePaymentMaker insufficient funds handling', () => { // Create a mock signing client mockSigningClient = { + account: { + address: '0xtest-address', + }, signMessage: vi.fn(), sendTransaction: vi.fn(), waitForTransactionReceipt: vi.fn(), readContract: vi.fn(), }; + const walletClient = { + account: { + address: '0xtest-address', + }, + extend: vi.fn(() => mockSigningClient), + } as any; + paymentMaker = new BasePaymentMaker( 'https://fake-rpc.com', - '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef', + walletClient, ); - // Inject our mock signing client (using any here is acceptable for testing internal state) - (paymentMaker as any).signingClient = mockSigningClient; + // Mock signing client is already injected via the walletClient.extend() mock }); it('should throw InsufficientFundsError when balance is less than required', async () => { @@ -91,7 +109,7 @@ describe('BasePaymentMaker insufficient funds handling', () => { address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", abi: expect.any(Array), functionName: 'balanceOf', - args: ['0x1234567890abcdef1234567890abcdef12345678'], + args: ['0xtest-address'], }); // Verify transaction was not attempted diff --git a/packages/atxp-client/src/basePaymentMaker.test.ts b/packages/atxp-client/src/basePaymentMaker.test.ts index d36e415d..d12de23a 100644 --- a/packages/atxp-client/src/basePaymentMaker.test.ts +++ b/packages/atxp-client/src/basePaymentMaker.test.ts @@ -1,12 +1,19 @@ import { describe, it, expect } from 'vitest'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; +import { createWalletClient, http } from 'viem'; +import { base } from 'viem/chains'; import { BasePaymentMaker } from './basePaymentMaker.js'; describe('basePaymentMaker.generateJWT', () => { it('should generate a valid JWT with default payload', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const paymentMaker = new BasePaymentMaker('https://example.com', privateKey); + const walletClient = createWalletClient({ + account, + chain: base, + transport: http('https://example.com') + }); + const paymentMaker = new BasePaymentMaker('https://example.com', walletClient); const jwt = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); // JWT format: header.payload.signature (all base64url) @@ -38,15 +45,17 @@ describe('basePaymentMaker.generateJWT', () => { // For now, we just verify the signature is present and properly formatted expect(signatureB64).toBeDefined(); expect(signatureB64.length).toBeGreaterThan(0); - - // Decode the signature to verify it's a hex string with 0x prefix - const decodedSig = Buffer.from(signatureB64, 'base64url').toString('utf8'); - expect(decodedSig).toMatch(/^0x[a-fA-F0-9]+$/); }); it('should include payment request id if provided', async () => { const privateKey = generatePrivateKey(); - const paymentMaker = new BasePaymentMaker('https://example.com', privateKey); + const account = privateKeyToAccount(privateKey); + const walletClient = createWalletClient({ + account, + chain: base, + transport: http('https://example.com') + }); + const paymentMaker = new BasePaymentMaker('https://example.com', walletClient); const paymentRequestId = 'id1'; const jwt = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); const [, payloadB64] = jwt.split('.'); diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 40ff475e..bd7ef13a 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -15,7 +15,7 @@ import { //decodeAbiParameters, //parseSignature, } from "viem"; -import { privateKeyToAccount } from "viem/accounts"; +// import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; import { BigNumber } from "bignumber.js"; @@ -184,6 +184,7 @@ export class BasePaymentMaker implements PaymentMaker { protected signingClient: ExtendedWalletClient; //protected account: Account; protected logger: Logger; + protected isWebAuthn: boolean = false; // Default to standard EOA auth /* static fromSecretKey(baseRPCUrl: string, sourceSecretKey: Hex, logger?: Logger): BasePaymentMaker { @@ -212,13 +213,10 @@ export class BasePaymentMaker implements PaymentMaker { } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { - // TODO: Detect wallet type properly - const isWebAuthn = true; // TODO: Detect if using WebAuthn/Coinbase Smart Wallet - - if (isWebAuthn) { + if (this.isWebAuthn) { // For WebAuthn/Coinbase Smart Wallets, use EIP-1271 instead of JWT - console.log('\n=== EIP-1271 Authentication Mode ==='); - console.log('Using EIP-1271 signature verification for smart wallet'); + this.logger.info('=== EIP-1271 Authentication Mode ==='); + this.logger.info('Using EIP-1271 signature verification for smart wallet'); // Create a structured message for signing const timestamp = Math.floor(Date.now() / 1000); @@ -244,7 +242,7 @@ export class BasePaymentMaker implements PaymentMaker { const message = messageParts.join('\n'); - console.log('Message to sign:', message); + this.logger.info(`Message to sign: ${message}`); // Sign the message with the wallet (triggers WebAuthn/fingerprint) const signature = await this.signingClient.signMessage({ @@ -252,7 +250,7 @@ export class BasePaymentMaker implements PaymentMaker { message: message, }); - console.log('Signature (WebAuthn response):', signature.substring(0, 100) + '...'); + this.logger.info(`Signature (WebAuthn response): ${signature.substring(0, 100)}...`); // Create the auth data object const authData = { @@ -268,8 +266,8 @@ export class BasePaymentMaker implements PaymentMaker { // Serialize as base64url for transmission (similar to JWT format) const serialized = toBase64Url(JSON.stringify(authData)); - console.log('Serialized auth data length:', serialized.length); - console.log('Serialized auth data:', serialized); + this.logger.info(`Serialized auth data length: ${serialized.length}`); + this.logger.info(`Serialized auth data: ${serialized}`); return serialized; } else { @@ -312,7 +310,7 @@ export class BasePaymentMaker implements PaymentMaker { } const jwt = `${header}.${payload}.${signature}`; - console.log('Generated ES256K JWT:', jwt); + this.logger.info(`Generated ES256K JWT: ${jwt}`); return jwt; } } From 3a86e13cbd29aa285673710e67cdfb09b6ea8314 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 13:51:25 -0700 Subject: [PATCH 33/53] Logger --- packages/atxp-base/src/baseAppAccount.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 6707d938..24cbeac2 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -4,7 +4,7 @@ import type { WalletClient } from 'viem'; import { IStorage, BrowserStorage } from './storage.js'; // import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { createPaymasterSmartWallet, type PaymasterSmartWallet } from './paymasterHelpers.js'; -import { Logger } from '@atxp/common'; +import { ConsoleLogger, Logger } from '@atxp/common'; // const DEFAULT_ALLOWANCE = 10n; // const DEFAULT_PERIOD_IN_DAYS = 7; @@ -32,6 +32,8 @@ export class BaseAppAccount implements Account { }, logger?: Logger, ): Promise { + logger = logger || new ConsoleLogger(); + // Validate smart wallet configuration if (!config.apiKey) { throw new Error( From 2f2b6210de11aa6d4c49307c345cf3edfee6cf74 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 14:25:43 -0700 Subject: [PATCH 34/53] Paymaster working? almost working? (Brian's version) --- packages/atxp-base/src/baseAppAccount.ts | 18 ++-- packages/atxp-base/src/baseAppPaymentMaker.ts | 47 +++++----- packages/atxp-base/src/index.ts | 5 +- packages/atxp-base/src/paymasterHelpers.ts | 90 +++++-------------- 4 files changed, 56 insertions(+), 104 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 24cbeac2..90af1b27 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -3,7 +3,7 @@ import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import type { WalletClient } from 'viem'; import { IStorage, BrowserStorage } from './storage.js'; // import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; -import { createPaymasterSmartWallet, type PaymasterSmartWallet } from './paymasterHelpers.js'; +import { validatePaymasterCapabilities } from './paymasterHelpers.js'; import { ConsoleLogger, Logger } from '@atxp/common'; // const DEFAULT_ALLOWANCE = 10n; @@ -12,7 +12,6 @@ import { ConsoleLogger, Logger } from '@atxp/common'; export class BaseAppAccount implements Account { accountId: string; paymentMakers: { [key: string]: PaymentMaker }; - private smartWallet?: PaymasterSmartWallet; private static toStorageKey(userWalletAddress: string): string { return `atxp-base-permission-${userWalletAddress}`; @@ -80,14 +79,13 @@ export class BaseAppAccount implements Account { */ - // Create paymaster smart wallet if enabled (defaults to true) - let smartWallet: PaymasterSmartWallet | undefined; + // Validate paymaster capabilities if enabled (defaults to true) if (config.usePaymaster !== false) { - smartWallet = await createPaymasterSmartWallet(walletClient, config.apiKey); - logger?.info(`Created smart wallet with paymaster at: ${smartWallet.address}`); + await validatePaymasterCapabilities(walletClient); + logger?.info(`Validated paymaster capabilities for wallet: ${walletClient.account!.address}`); } - return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, smartWallet, logger); + return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, logger); } /* @@ -310,7 +308,6 @@ export class BaseAppAccount implements Account { //account: ViemAccount, walletClient: WalletClient, apiKey: string, - smartWallet?: PaymasterSmartWallet, logger?: Logger ) { if (!baseRPCUrl) { @@ -320,11 +317,10 @@ export class BaseAppAccount implements Account { throw new Error('Wallet client is required'); } - this.accountId = smartWallet ? smartWallet.address : walletClient!.account!.address; - this.smartWallet = smartWallet; + this.accountId = walletClient.account!.address; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, walletClient, smartWallet, logger), + 'base': new BaseAppPaymentMaker(baseRPCUrl, walletClient, logger), } } diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 2d01765a..a151d112 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -3,17 +3,14 @@ import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; import { encodeFunctionData, /*getAddress, Account,*/ WalletClient } from 'viem'; //import { SpendPermission } from './types.js'; -import { type PaymasterSmartWallet } from './paymasterHelpers.js'; +import { validatePaymasterCapabilities } from './paymasterHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { - private smartWallet?: PaymasterSmartWallet; - constructor( baseRPCUrl: string, //spendPermission: SpendPermission, //account: Account, walletClient: WalletClient, - smartWallet?: PaymasterSmartWallet, logger?: Logger ) { //if (!spendPermission) { @@ -21,16 +18,13 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { //} super(baseRPCUrl, walletClient, logger); //this.spendPermission = spendPermission; - this.smartWallet = smartWallet; this.isWebAuthn = true; // BaseAppPaymentMaker uses WebAuthn/Smart Wallet auth } - // Override makePayment to use paymaster smart wallet when available + // Override makePayment to use paymaster-sponsored transactions async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { - // If no smart wallet, use regular payment from parent class - if (!this.smartWallet) { - return super.makePayment(amount, currency, receiver); - } + // Validate paymaster capabilities + await validatePaymasterCapabilities(this.signingClient); // Use paymaster-sponsored transaction if (currency !== 'USDC') { @@ -70,28 +64,35 @@ export class BaseAppPaymentMaker extends BasePaymentMaker { }); try { - // Send user operation with paymaster sponsorship - const userOpHash = await this.smartWallet!.bundlerClient.sendUserOperation({ + this.logger.info('Using EIP-5792 sendCalls with native paymaster support'); + + // Use sendCalls for the transaction + const result = await this.signingClient.sendCalls({ calls: [{ to: USDC_CONTRACT_ADDRESS_BASE, data: transferCalldata, value: 0n }], + capabilities: { + // The wallet should use its configured paymaster + paymasterService: { + url: `https://api.developer.coinbase.com/rpc/v1/base` + } + } }); - this.logger.info(`Paymaster-sponsored UserOperation sent: ${userOpHash}`); - - // Wait for the operation to be confirmed - const receipt = await this.smartWallet!.bundlerClient.waitForUserOperationReceipt({ - hash: userOpHash - }); + // Extract the id from the result + const callsId = typeof result === 'string' ? result : result.id; + + this.logger.info(`Paymaster-sponsored sendCalls initiated: ${callsId}`); - if (!receipt.success) { - throw new Error(`UserOperation failed: ${userOpHash}`); - } + // Wait for the calls to be confirmed + const status = await this.signingClient.waitForCallsStatus({ id: callsId }); - this.logger.info(`Paymaster-sponsored payment confirmed: ${receipt.receipt.transactionHash}`); - return receipt.receipt.transactionHash; + this.logger.info(`Paymaster-sponsored payment confirmed with status: ${JSON.stringify(status)}`); + + // For EIP-5792, return the calls ID as the transaction identifier + return callsId; } catch (error) { this.logger.error(`Paymaster transaction failed: ${error}`); throw error; diff --git a/packages/atxp-base/src/index.ts b/packages/atxp-base/src/index.ts index f28231ee..10cabec8 100644 --- a/packages/atxp-base/src/index.ts +++ b/packages/atxp-base/src/index.ts @@ -8,7 +8,4 @@ export { BrowserStorage, MemoryStorage } from './storage.js'; -export { - createPaymasterSmartWallet, - type PaymasterSmartWallet -} from './paymasterHelpers.js'; +export { validatePaymasterCapabilities } from './paymasterHelpers.js'; diff --git a/packages/atxp-base/src/paymasterHelpers.ts b/packages/atxp-base/src/paymasterHelpers.ts index 80e09f8a..690d0a28 100644 --- a/packages/atxp-base/src/paymasterHelpers.ts +++ b/packages/atxp-base/src/paymasterHelpers.ts @@ -1,76 +1,34 @@ -import { - http, - createPublicClient, - type Address, - type WalletClient, -} from 'viem'; -import { base } from 'viem/chains'; -import { - toCoinbaseSmartAccount, - createBundlerClient, - createPaymasterClient, - type BundlerClient, - type SmartAccount, - type PaymasterClient -} from 'viem/account-abstraction'; - -// Coinbase CDP endpoints -const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; - -export interface PaymasterSmartWallet { - address: Address; - bundlerClient: BundlerClient; - paymasterClient: PaymasterClient; - account: SmartAccount; -} +import { type WalletClient } from 'viem'; /** - * Creates a smart wallet with paymaster support for sponsored transactions - * @param walletClient - The wallet client with the account that will own the smart wallet - * @param apiKey - Coinbase CDP API key for paymaster services - * @returns PaymasterSmartWallet with bundler and paymaster clients configured + * Validates that a wallet client supports paymaster functionality via EIP-5792 + * @param walletClient - The wallet client to validate + * @throws Error if the wallet client doesn't support required features */ -export async function createPaymasterSmartWallet( - walletClient: WalletClient, - apiKey: string -): Promise { +export async function validatePaymasterCapabilities( + walletClient: WalletClient +): Promise { if (!walletClient.account) { throw new Error('Wallet client must have an account'); } - const publicClient = createPublicClient({ - chain: base, - transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) - }); - - // Create the Coinbase smart wallet - const account = await toCoinbaseSmartAccount({ - client: publicClient, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - owners: [walletClient.account as any], // Type mismatch between viem Account types - version: '1', - }); - - // Create paymaster client - const paymasterClient = createPaymasterClient({ - transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) - }); - - // Create bundler client with paymaster support - const bundlerClient = createBundlerClient({ - account, - client: publicClient, - transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), - chain: base, - paymaster: paymasterClient, - }); + if (!('sendCalls' in walletClient)) { + throw new Error( + `WalletClient does not have sendCalls method (EIP-5792). ` + + `Available methods: ${Object.keys(walletClient).join(', ')}` + ); + } + + console.log('Validated EIP-5792 wallet with sendCalls support:', walletClient.account.address); - return { - address: account.address, - bundlerClient, - paymasterClient, - account, - }; + // Check wallet capabilities for debugging + if ('getCapabilities' in walletClient) { + try { + const capabilities = await walletClient.getCapabilities(); + console.log('Wallet capabilities:', capabilities); + } catch (error) { + console.log('Error getting capabilities:', error); + } + } } From 5463ce45725be4045b1fbf55e4ed0251c2b73949 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20No=C3=ABl-Romas?= Date: Mon, 25 Aug 2025 16:25:10 -0500 Subject: [PATCH 35/53] bookmark --- package-lock.json | 120 +++++++++++++++++ packages/atxp-base/package.json | 1 + packages/atxp-base/src/baseAppAccount.ts | 61 +++++---- packages/atxp-base/src/smartWalletHelpers.ts | 128 +++++++++---------- packages/atxp-base/tsconfig.cjs.json | 2 +- packages/atxp-base/tsconfig.json | 6 +- 6 files changed, 228 insertions(+), 90 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2ec68b5a..6e55c7c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1819,6 +1819,75 @@ "node": ">=6.9.0" } }, + "node_modules/@base-org/account": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.0.2.tgz", + "integrity": "sha512-p/mefIVfiKxDYWIoZSp1VeCXmh3hqmaD8ThS7YKMnuxljfM6dOJTxvUpZ/emkXvQQa1nnCA+TRVZt1nCrs5ACA==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "1.4.0", + "clsx": "1.2.1", + "eventemitter3": "5.0.1", + "idb-keyval": "6.2.1", + "ox": "0.6.9", + "preact": "10.24.2", + "viem": "^2.31.7", + "zustand": "5.0.3" + } + }, + "node_modules/@base-org/account/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@base-org/account/node_modules/ox": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@base-org/account/node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@csstools/color-helpers": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", @@ -6801,6 +6870,15 @@ "node": ">=0.8" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9533,6 +9611,12 @@ "node": ">=0.10.0" } }, + "node_modules/idb-keyval": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", + "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", + "license": "Apache-2.0" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -12657,8 +12741,11 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) +======= +>>>>>>> 09c3e77 (bookmark) "node_modules/preact": { "version": "10.24.2", "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", @@ -12670,6 +12757,7 @@ } }, <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD "node_modules/prebuild-install": { "version": "7.1.3", @@ -12714,6 +12802,8 @@ >>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) ======= >>>>>>> 2ace185 (Comment out code to get clean build without ox dep TS build issue) +======= +>>>>>>> 09c3e77 (bookmark) "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16302,6 +16392,35 @@ "zod": "^3.24.1" } }, + "node_modules/zustand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", + "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, "packages/atxp-base": { "name": "@atxp/base", "version": "0.2.10", @@ -16309,6 +16428,7 @@ "dependencies": { "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", + "@base-org/account": "^2.0.2", "bignumber.js": "^9.3.0", "viem": "^2.34.0" }, diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index 85c835f4..a038aaff 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -24,6 +24,7 @@ "dependencies": { "@atxp/client": "0.2.10", "@atxp/common": "0.2.10", + "@base-org/account": "^2.0.2", "bignumber.js": "^9.3.0", "viem": "^2.34.0" }, diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 90af1b27..7041772e 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -5,6 +5,14 @@ import { IStorage, BrowserStorage } from './storage.js'; // import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { validatePaymasterCapabilities } from './paymasterHelpers.js'; import { ConsoleLogger, Logger } from '@atxp/common'; +import { getAddress, createPublicClient, http, Account as ViemAccount } from 'viem'; +import { base } from 'viem/chains'; +import { SpendPermission } from './types.js'; +import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; +import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { Logger } from '@atxp/common'; +import { createBaseAccountSDK } from "@base-org/account"; +import { requestSpendPermission } from "@base-org/account/spend-permission"; // const DEFAULT_ALLOWANCE = 10n; // const DEFAULT_PERIOD_IN_DAYS = 7; @@ -40,13 +48,12 @@ export class BaseAppAccount implements Account { 'Get your API key from https://portal.cdp.coinbase.com/' ); } - - /* + // Initialize storage const baseStorage = config?.storage || new BrowserStorage(); const storage = new IntermediaryStorage(baseStorage); const storageKey = this.toStorageKey(userWalletAddress); - + // Try to load existing permission const existingData = this.loadSavedWalletAndPermission(storage, storageKey); if (existingData) { @@ -55,24 +62,32 @@ export class BaseAppAccount implements Account { return new BaseAppAccount(baseRPCUrl, existingData.permission, account, smartWallet, logger); } - // Create new wallet and permission + const sdk = createBaseAccountSDK({ + appName: config?.appName, + appChainIds: [base.id], + paymasterUrls: { + [base.id]: 'https://api.developer.coinbase.com/rpc/v1/base/snPdXqIzOGhRkGNJvEHM5bl9Hm3yRO3m', + } + }); + const provider = sdk.getProvider(); + await sdk.getProvider().request({ method: 'wallet_connect' }); + const privateKey = generatePrivateKey(); const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); console.log('Generated ephemeral wallet:', smartWallet.address); - // Deploy smart wallet - //await this.deploySmartWallet(privateKey, config.apiKey); + await this.deploySmartWallet(smartWallet, config.apiKey); + + const permission = await requestSpendPermission({ + account: userWalletAddress, + spender: smartWallet.address, + token: USDC_CONTRACT_ADDRESS_BASE, + chainId: base.id, + allowance: config?.allowance ?? DEFAULT_ALLOWANCE, + periodInDays: config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS, + provider, + }); - // Check USDC allowance before creating smart wallet - // TODO: We probably need to keep this - it's stored on-chain, so doesn't wipe when we clear storage - //await this.checkAndRequestUSDCApproval(baseRPCUrl, userWalletAddress, walletClient); - - // Create spend permission - const permission = await this.createSpendPermission( - userWalletAddress, - walletClient, - smartWallet.address, - config - ); + console.log('Permission:', permission); // Save wallet and permission storage.set(storageKey, {privateKey, permission}); @@ -86,9 +101,9 @@ export class BaseAppAccount implements Account { } return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, logger); + return new BaseAppAccount(baseRPCUrl, smartWallet.account, logger); } - /* private static loadSavedWalletAndPermission( permissionStorage: IntermediaryStorage, storageKey: string @@ -107,6 +122,7 @@ export class BaseAppAccount implements Account { return storedData; } + /* private static async checkAndRequestUSDCApproval( baseRPCUrl: string, userWalletAddress: string, @@ -247,15 +263,14 @@ export class BaseAppAccount implements Account { createdAt: now, }; } + */ private static async deploySmartWallet( - privateKey: `0x${string}`, + smartWallet: EphemeralSmartWallet, apiKey: string ): Promise { console.log('Deploying smart wallet to enable spend permissions...'); - const smartWallet = await toEphemeralSmartWallet(privateKey, apiKey); - const deployTx = await smartWallet.client.sendUserOperation({ calls: [{ to: smartWallet.address, @@ -276,6 +291,8 @@ export class BaseAppAccount implements Account { console.log('✅ Smart wallet deployed successfully at:', smartWallet.address); } + /* + constructor( baseRPCUrl: string, spendPermission: SpendPermission, @@ -338,4 +355,4 @@ export class BaseAppAccount implements Account { storage.delete(this.toStorageKey(userWalletAddress)); // Data cleared from storage } -} \ No newline at end of file +} diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index 64470ab0..41233be2 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -1,71 +1,71 @@ -// import { -// http, -// createPublicClient, -// type Account, -// type Address, -// type LocalAccount, -// } from 'viem'; -// import { base } from 'viem/chains'; -// import { privateKeyToAccount } from 'viem/accounts'; -// import { -// toCoinbaseSmartAccount, -// createBundlerClient, -// createPaymasterClient, -// type BundlerClient, -// type SmartAccount -// } from 'viem/account-abstraction'; +import { + http, + createPublicClient, + type Account, + type Address, + type LocalAccount, +} from 'viem'; +import { base } from 'viem/chains'; +import { privateKeyToAccount } from 'viem/accounts'; +import { + toCoinbaseSmartAccount, + createBundlerClient, + createPaymasterClient, + type BundlerClient, + type SmartAccount +} from 'viem/account-abstraction'; // Coinbase CDP Paymaster and Bundler endpoints -// const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -// const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +const COINBASE_BUNDLER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; +const COINBASE_PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base'; -// export interface EphemeralSmartWallet { -// address: Address; -// client: BundlerClient; -// account: SmartAccount; -// signer: Account; -// } +export interface EphemeralSmartWallet { + address: Address; + client: BundlerClient; + account: SmartAccount; + signer: Account; +} -// /** -// * Creates an ephemeral smart wallet with paymaster support -// */ -// export async function toEphemeralSmartWallet( -// privateKey: `0x${string}`, -// apiKey: string -// ): Promise { -// const signer = privateKeyToAccount(privateKey); -// -// const publicClient = createPublicClient({ -// chain: base, -// transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) -// }); -// -// // Create the Coinbase smart wallet -// const account = await toCoinbaseSmartAccount({ -// client: publicClient, -// owners: [signer], -// version: '1' -// }); -// -// // Create bundler client with paymaster support -// const bundlerClient = createBundlerClient({ -// account, -// client: publicClient, -// transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), -// chain: base, -// paymaster: true, // Enable paymaster sponsorship -// paymasterContext: { -// transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) -// } -// }); -// -// return { -// address: account.address, -// client: bundlerClient, -// account, -// signer, -// }; -// } +/** + * Creates an ephemeral smart wallet with paymaster support + */ +export async function toEphemeralSmartWallet( + privateKey: `0x${string}`, + apiKey: string +): Promise { + const signer = privateKeyToAccount(privateKey); + + const publicClient = createPublicClient({ + chain: base, + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) + }); + + // Create the Coinbase smart wallet + const account = await toCoinbaseSmartAccount({ + client: publicClient, + owners: [signer], + version: '1' + }); + + // Create bundler client with paymaster support + const bundlerClient = createBundlerClient({ + account, + client: publicClient, + transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`), + chain: base, + paymaster: true, // Enable paymaster sponsorship + paymasterContext: { + transport: http(`${COINBASE_PAYMASTER_URL}/${apiKey}`) + } + }); + + return { + address: account.address, + client: bundlerClient, + account, + signer, + }; +} // /** // * Gets the counterfactual address for a smart wallet without deploying it diff --git a/packages/atxp-base/tsconfig.cjs.json b/packages/atxp-base/tsconfig.cjs.json index 87f5a7b8..d2d60092 100644 --- a/packages/atxp-base/tsconfig.cjs.json +++ b/packages/atxp-base/tsconfig.cjs.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "module": "CommonJS", - "moduleResolution": "node", + "moduleResolution": "NodeNext", "outDir": "./dist-cjs" } } \ No newline at end of file diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index 2d614886..c6cadaff 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "target": "ES2020", - "module": "ESNext", - "moduleResolution": "bundler", + "module": "NodeNext", + "moduleResolution": "NodeNext", "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", @@ -22,4 +22,4 @@ "references": [ { "path": "../atxp-common" } ] -} \ No newline at end of file +} From 9e731877b4e8e3ba3f916de060943f2d7f096428 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 14:54:29 -0700 Subject: [PATCH 36/53] Plumb through ephemeralSmartWallet to baseAppPaymentMaker --- packages/atxp-base/src/baseAppAccount.ts | 20 +++++++++++-------- packages/atxp-base/src/baseAppPaymentMaker.ts | 6 +++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 7041772e..85890296 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -57,9 +57,10 @@ export class BaseAppAccount implements Account { // Try to load existing permission const existingData = this.loadSavedWalletAndPermission(storage, storageKey); if (existingData) { - const smartWallet = await toEphemeralSmartWallet(existingData.privateKey, config.apiKey); - const account = privateKeyToAccount(existingData.privateKey); - return new BaseAppAccount(baseRPCUrl, existingData.permission, account, smartWallet, logger); + const ephemeralSmartWallet = await toEphemeralSmartWallet(existingData.privateKey, config.apiKey); + //const account = privateKeyToAccount(existingData.privateKey); + // The constructor now expects a WalletClient, not individual parameters + return new BaseAppAccount(baseRPCUrl, existingData.permission, ephemeralSmartWallet, logger); } const sdk = createBaseAccountSDK({ @@ -101,7 +102,7 @@ export class BaseAppAccount implements Account { } return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, logger); - return new BaseAppAccount(baseRPCUrl, smartWallet.account, logger); + return new BaseAppAccount(baseRPCUrl, permission, smartWallet, logger); } private static loadSavedWalletAndPermission( @@ -323,21 +324,24 @@ export class BaseAppAccount implements Account { constructor( baseRPCUrl: string, //account: ViemAccount, - walletClient: WalletClient, + //walletClient: WalletClient, apiKey: string, + //walletClient: WalletClient, + spendPermission: SpendPermission, + ephemeralSmartWallet: EphemeralSmartWallet, logger?: Logger ) { if (!baseRPCUrl) { throw new Error('Base RPC URL is required'); } - if (!walletClient) { + if (!ephemeralSmartWallet) { throw new Error('Wallet client is required'); } - this.accountId = walletClient.account!.address; + this.accountId = ephemeralSmartWallet.address; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, walletClient, logger), + 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, ephemeralSmartWallet, logger), } } diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index a151d112..a0a48bdb 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -4,13 +4,17 @@ import { BigNumber } from 'bignumber.js'; import { encodeFunctionData, /*getAddress, Account,*/ WalletClient } from 'viem'; //import { SpendPermission } from './types.js'; import { validatePaymasterCapabilities } from './paymasterHelpers.js'; +import { encodeFunctionData, getAddress, Account, WalletClient } from 'viem'; +import { SpendPermission } from './types.js'; +import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; export class BaseAppPaymentMaker extends BasePaymentMaker { constructor( baseRPCUrl: string, - //spendPermission: SpendPermission, + spendPermission: SpendPermission, //account: Account, walletClient: WalletClient, + smartWallet: EphemeralSmartWallet, logger?: Logger ) { //if (!spendPermission) { From c0df54dd094363ca8fd9651abdd50b7d4e516bc6 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 16:03:28 -0700 Subject: [PATCH 37/53] Up to making a payment --- packages/atxp-base/src/baseAppAccount.ts | 32 ++---- packages/atxp-base/src/baseAppPaymentMaker.ts | 102 +++--------------- packages/atxp-client/src/basePaymentMaker.ts | 15 +-- 3 files changed, 30 insertions(+), 119 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 85890296..7d60c1ef 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -1,21 +1,19 @@ import type { Account, PaymentMaker } from '@atxp/client'; +import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; +import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; import type { WalletClient } from 'viem'; -import { IStorage, BrowserStorage } from './storage.js'; -// import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; -import { validatePaymasterCapabilities } from './paymasterHelpers.js'; -import { ConsoleLogger, Logger } from '@atxp/common'; import { getAddress, createPublicClient, http, Account as ViemAccount } from 'viem'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; -import { Logger } from '@atxp/common'; +import { ConsoleLogger, Logger } from '@atxp/common'; import { createBaseAccountSDK } from "@base-org/account"; import { requestSpendPermission } from "@base-org/account/spend-permission"; -// const DEFAULT_ALLOWANCE = 10n; -// const DEFAULT_PERIOD_IN_DAYS = 7; +const DEFAULT_ALLOWANCE = 10n; +const DEFAULT_PERIOD_IN_DAYS = 7; export class BaseAppAccount implements Account { accountId: string; @@ -35,12 +33,10 @@ export class BaseAppAccount implements Account { periodInDays?: number; storage?: IStorage; apiKey: string; - usePaymaster?: boolean; // Defaults to true - set to false to disable paymaster sponsorship }, logger?: Logger, ): Promise { logger = logger || new ConsoleLogger(); - // Validate smart wallet configuration if (!config.apiKey) { throw new Error( @@ -93,15 +89,7 @@ export class BaseAppAccount implements Account { // Save wallet and permission storage.set(storageKey, {privateKey, permission}); - */ - - // Validate paymaster capabilities if enabled (defaults to true) - if (config.usePaymaster !== false) { - await validatePaymasterCapabilities(walletClient); - logger?.info(`Validated paymaster capabilities for wallet: ${walletClient.account!.address}`); - } - - return new BaseAppAccount(baseRPCUrl, walletClient, config.apiKey, logger); + //return new BaseAppAccount(baseRPCUrl, permission, account, smartWallet, logger); return new BaseAppAccount(baseRPCUrl, permission, smartWallet, logger); } @@ -129,7 +117,7 @@ export class BaseAppAccount implements Account { userWalletAddress: string, walletClient: WalletClient ): Promise { - const USDC_CONTRACT = getAddress(USDC_CONTRACT_ADDRESS_BASE); + const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); const publicClient = createPublicClient({ @@ -325,8 +313,6 @@ export class BaseAppAccount implements Account { baseRPCUrl: string, //account: ViemAccount, //walletClient: WalletClient, - apiKey: string, - //walletClient: WalletClient, spendPermission: SpendPermission, ephemeralSmartWallet: EphemeralSmartWallet, logger?: Logger @@ -357,6 +343,6 @@ export class BaseAppAccount implements Account { storage = storage || new BrowserStorage(); storage.delete(this.toStorageKey(userWalletAddress)); - // Data cleared from storage + console.log(`All ATXP-related data cleared from storage for ${userWalletAddress}`); } -} +} \ No newline at end of file diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index a0a48bdb..b61410c0 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,106 +1,36 @@ -import { BasePaymentMaker, USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; +import { BasePaymentMaker } from '@atxp/client'; import { Logger, Currency } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, /*getAddress, Account,*/ WalletClient } from 'viem'; -//import { SpendPermission } from './types.js'; -import { validatePaymasterCapabilities } from './paymasterHelpers.js'; -import { encodeFunctionData, getAddress, Account, WalletClient } from 'viem'; +import { encodeFunctionData, getAddress, Account, WalletClient, http, createWalletClient } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; +import { base } from 'viem/chains'; export class BaseAppPaymentMaker extends BasePaymentMaker { + //private spendPermission: SpendPermission; + //private smartWallet: EphemeralSmartWallet; + constructor( baseRPCUrl: string, spendPermission: SpendPermission, //account: Account, - walletClient: WalletClient, + //walletClient: WalletClient, smartWallet: EphemeralSmartWallet, logger?: Logger ) { //if (!spendPermission) { //throw new Error('Spend permission is required'); //} - super(baseRPCUrl, walletClient, logger); - //this.spendPermission = spendPermission; - this.isWebAuthn = true; // BaseAppPaymentMaker uses WebAuthn/Smart Wallet auth - } - - // Override makePayment to use paymaster-sponsored transactions - async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { - // Validate paymaster capabilities - await validatePaymasterCapabilities(this.signingClient); - - // Use paymaster-sponsored transaction - if (currency !== 'USDC') { - throw new Error('Only USDC currency is supported; received ' + currency); - } - - const amountBigInt = this.convertAmountToBigInt(amount); - - this.logger.info(`Making paymaster-sponsored payment of ${amount} ${currency} to ${receiver} on Base`); - - return await this.executePaymasterTransaction(amountBigInt, receiver); - } - - private convertAmountToBigInt(amount: BigNumber): bigint { - // Convert USDC amount to its smallest unit (6 decimals) - const USDC_DECIMALS = 6; - const amountInMicroUsdc = amount.multipliedBy(10 ** USDC_DECIMALS); - return BigInt(amountInMicroUsdc.toFixed(0)); - } - - private async executePaymasterTransaction(amountBigInt: bigint, receiver: string): Promise { - - // Prepare USDC transfer call - const transferCalldata = encodeFunctionData({ - abi: [{ - inputs: [ - { name: 'to', type: 'address' }, - { name: 'amount', type: 'uint256' } - ], - name: 'transfer', - outputs: [{ name: '', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function' - }], - functionName: 'transfer', - args: [receiver as `0x${string}`, amountBigInt] + const client = createWalletClient({ + account: smartWallet.signer, + chain: base, + transport: http(baseRPCUrl) }); - - try { - this.logger.info('Using EIP-5792 sendCalls with native paymaster support'); - - // Use sendCalls for the transaction - const result = await this.signingClient.sendCalls({ - calls: [{ - to: USDC_CONTRACT_ADDRESS_BASE, - data: transferCalldata, - value: 0n - }], - capabilities: { - // The wallet should use its configured paymaster - paymasterService: { - url: `https://api.developer.coinbase.com/rpc/v1/base` - } - } - }); - - // Extract the id from the result - const callsId = typeof result === 'string' ? result : result.id; - - this.logger.info(`Paymaster-sponsored sendCalls initiated: ${callsId}`); - - // Wait for the calls to be confirmed - const status = await this.signingClient.waitForCallsStatus({ id: callsId }); - - this.logger.info(`Paymaster-sponsored payment confirmed with status: ${JSON.stringify(status)}`); - - // For EIP-5792, return the calls ID as the transaction identifier - return callsId; - } catch (error) { - this.logger.error(`Paymaster transaction failed: ${error}`); - throw error; - } + // TODO: Probably wrong + super(baseRPCUrl, client, logger); + this.isWebAuthn = false; + //this.spendPermission = spendPermission; + //this.smartWallet = smartWallet; } diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index bd7ef13a..e1da28b6 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -213,6 +213,7 @@ export class BasePaymentMaker implements PaymentMaker { } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { + // TODO: Delete isWebAuthn and the entire EIP-1271 block below - we only do payments with EOA wallets if (this.isWebAuthn) { // For WebAuthn/Coinbase Smart Wallets, use EIP-1271 instead of JWT this.logger.info('=== EIP-1271 Authentication Mode ==='); @@ -298,16 +299,10 @@ export class BasePaymentMaker implements PaymentMaker { }); // For ES256K, signature is typically 65 bytes (r,s,v) - let signature: string; - if (typeof Buffer !== 'undefined') { - signature = Buffer.from(signResult.slice(2), 'hex').toString('base64url'); - } else { - // Browser environment - const hexStr = signResult.slice(2); - const bytes = new Uint8Array(hexStr.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16))); - const base64 = btoa(String.fromCharCode(...bytes)); - signature = base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); - } + // Server expects the hex signature string (with 0x prefix) to be base64url encoded + // This creates: base64url("0x6eb2565...") not base64url(rawBytes) + // Pass the hex string directly to toBase64Url which will UTF-8 encode and base64url it + const signature = toBase64Url(signResult); const jwt = `${header}.${payload}.${signature}`; this.logger.info(`Generated ES256K JWT: ${jwt}`); From c182a9f7cd0394226cd39356b4cb13b02f0ea62d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20No=C3=ABl-Romas?= Date: Mon, 25 Aug 2025 22:54:35 -0500 Subject: [PATCH 38/53] standalone payment maker --- packages/atxp-base/src/baseAppPaymentMaker.ts | 355 +++++++----------- packages/atxp-client/src/basePaymentMaker.ts | 251 ++----------- 2 files changed, 176 insertions(+), 430 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index b61410c0..48fc0ec0 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,244 +1,171 @@ -import { BasePaymentMaker } from '@atxp/client'; -import { Logger, Currency } from '@atxp/common'; +import type { PaymentMaker } from '@atxp/client'; +import { Logger, Currency, ConsoleLogger } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, getAddress, Account, WalletClient, http, createWalletClient } from 'viem'; +import { encodeFunctionData, Address, getAddress, Account, WalletClient, http, createWalletClient, parseEther } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { base } from 'viem/chains'; +import { prepareSpendCallData } from '@base-org/account/spend-permission'; + +// Helper function to convert to base64url that works in both Node.js and browsers +function toBase64Url(data: string): string { + // Convert string to base64 + const base64 = typeof Buffer !== 'undefined' + ? Buffer.from(data).toString('base64') + : btoa(data); + // Convert base64 to base64url + return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); +} -export class BaseAppPaymentMaker extends BasePaymentMaker { - //private spendPermission: SpendPermission; - //private smartWallet: EphemeralSmartWallet; +const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet +const USDC_DECIMALS = 6; +const ERC20_ABI = [ + { + constant: false, + inputs: [ + { name: "_to", type: "address" }, + { name: "_value", type: "uint256" }, + ], + name: "transfer", + outputs: [{ name: "", type: "bool" }], + type: "function", + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } +]; + +export class BaseAppPaymentMaker implements PaymentMaker { + private logger: Logger; + private baseRPCUrl: string; + private spendPermission: SpendPermission; + private smartWallet: EphemeralSmartWallet; constructor( baseRPCUrl: string, - spendPermission: SpendPermission, - //account: Account, - //walletClient: WalletClient, + spendPermission: SpendPermission, smartWallet: EphemeralSmartWallet, logger?: Logger ) { - //if (!spendPermission) { - //throw new Error('Spend permission is required'); - //} - const client = createWalletClient({ - account: smartWallet.signer, - chain: base, - transport: http(baseRPCUrl) - }); - // TODO: Probably wrong - super(baseRPCUrl, client, logger); - this.isWebAuthn = false; - //this.spendPermission = spendPermission; - //this.smartWallet = smartWallet; + if (!spendPermission) { + throw new Error('Spend permission is required'); + } + if (!smartWallet) { + throw new Error('Smart wallet is required'); + } + this.baseRPCUrl = baseRPCUrl; + this.logger = logger ?? new ConsoleLogger(); + this.spendPermission = spendPermission; + this.smartWallet = smartWallet; } - - // override makePayment to use spend permissions - /*async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { - this.validatePaymentRequest(currency); - - const amountBigInt = this.convertAmountToBigInt(amount); + async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { + const headerObj = { alg: 'ES256K' }; - this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); - - this.logPaymentDetails(amountBigInt, receiver); + const payloadObj = { + sub: this.smartWallet.account.address, + iss: 'accounts.atxp.ai', + aud: 'https://auth.atxp.ai', + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 60 * 60, + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), + } as Record; + + const header = toBase64Url(JSON.stringify(headerObj)); + const payload = toBase64Url(JSON.stringify(payloadObj)); + const message = `${header}.${payload}`; + + const messageBytes = typeof Buffer !== 'undefined' + ? Buffer.from(message, 'utf8') + : new TextEncoder().encode(message); - // Execute the payment transaction - return await this.executePaymentTransaction(amountBigInt, receiver); + const signResult = await this.smartWallet.account.signMessage({ + message: { raw: messageBytes }, + }); + + // For ES256K, signature is typically 65 bytes (r,s,v) + // Server expects the hex signature string (with 0x prefix) to be base64url encoded + // This creates: base64url("0x6eb2565...") not base64url(rawBytes) + // Pass the hex string directly to toBase64Url which will UTF-8 encode and base64url it + const signature = toBase64Url(signResult); + + const jwt = `${header}.${payload}.${signature}`; + this.logger.info(`Generated ES256K JWT: ${jwt}`); + return jwt; } - private validatePaymentRequest(currency: Currency): void { + async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { if (currency !== 'USDC') { throw new Error('Only usdc currency is supported; received ' + currency); } - } - - private convertAmountToBigInt(amount: BigNumber): bigint { - // Convert USDC amount to its smallest unit (6 decimals) - // 0.01 USDC = 10,000 micro-USDC - const USDC_DECIMALS = 6; - const amountInMicroUsdc = amount.multipliedBy(10 ** USDC_DECIMALS); - return BigInt(amountInMicroUsdc.toFixed(0)); - } - - private logPaymentDetails(amountBigInt: bigint, receiver: string): void { - const now = Math.floor(Date.now() / 1000); - console.log('Spend permission details:', { - account: this.spendPermission.permission.account, - spender: this.spendPermission.permission.spender, - token: this.spendPermission.permission.token, - allowance: this.spendPermission.permission.allowance, - amount: amountBigInt.toString(), - receiver, - smartWallet: this.smartWallet?.address, - currentTime: now, - start: this.spendPermission.permission.start, - end: this.spendPermission.permission.end, - isValid: now >= Number(this.spendPermission.permission.start) && now <= Number(this.spendPermission.permission.end), - salt: this.spendPermission.permission.salt, - extraData: this.spendPermission.permission.extraData, - signature: this.spendPermission.signature - }); - } - private async executePaymentTransaction(amountBigInt: bigint, receiver: string): Promise { - const spendPermissionCalldata = this.prepareSpendPermissionCall(amountBigInt); - const usdcTransferCalldata = this.prepareUSDCTransferCall(amountBigInt, receiver); + this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); - try { - const userOpHash = await this.sendUserOperation(spendPermissionCalldata, usdcTransferCalldata); - return await this.waitForUserOperation(userOpHash); - } catch (error) { - this.handleTransactionError(error, amountBigInt, receiver); - throw error; + const spendCalls = await prepareSpendCallData(this.spendPermission, BigInt(amount.toString())); + const hash = await this.smartWallet.client.sendUserOperation({ + account: this.smartWallet.account, + calls: spendCalls.map(call => { + return { + chain: base, + to: call.to, + data: call.data, + value: parseEther('0'), + account: this.smartWallet.account + } + }) + }) + + const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ hash }) + if (!receipt) { + throw new Error('User operation failed'); } - } + this.logger.info(`User operation successful: ${receipt.userOpHash}`); - private prepareSpendPermissionCall(amountBigInt: bigint): `0x${string}` { - const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); - - return encodeFunctionData({ - abi: [{ - inputs: [ - { name: 'spendPermission', type: 'tuple', components: [ - { name: 'account', type: 'address' }, - { name: 'spender', type: 'address' }, - { name: 'token', type: 'address' }, - { name: 'allowance', type: 'uint160' }, - { name: 'period', type: 'uint48' }, - { name: 'start', type: 'uint48' }, - { name: 'end', type: 'uint48' }, - { name: 'salt', type: 'uint256' }, - { name: 'extraData', type: 'bytes' } - ]}, - { name: 'signature', type: 'bytes' }, - { name: 'amount', type: 'uint160' } - ], - name: 'spend', - outputs: [], - stateMutability: 'nonpayable', - type: 'function' - }], - functionName: 'spend', - args: [ - { - account: this.spendPermission.permission.account as `0x${string}`, - spender: this.spendPermission.permission.spender as `0x${string}`, - token: this.spendPermission.permission.token as `0x${string}`, - allowance: BigInt(this.spendPermission.permission.allowance), - period: Number(this.spendPermission.permission.period), - start: Number(this.spendPermission.permission.start), - end: Number(this.spendPermission.permission.end), - salt: BigInt(this.spendPermission.permission.salt), - extraData: this.spendPermission.permission.extraData as `0x${string}` - }, - this.spendPermission.signature as `0x${string}`, - amountBigInt - ] - }); - } - - private prepareUSDCTransferCall(amountBigInt: bigint, receiver: string): `0x${string}` { - const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - - const USDC_ABI = [{ - inputs: [ - { name: 'to', type: 'address' }, - { name: 'amount', type: 'uint256' } - ], - name: 'transfer', - outputs: [{ name: '', type: 'bool' }], - stateMutability: 'nonpayable', - type: 'function' - }]; - - return encodeFunctionData({ - abi: USDC_ABI, - functionName: 'transfer', - args: [receiver as `0x${string}`, amountBigInt] - }); - } - - private async sendUserOperation( - spendPermissionCalldata: `0x${string}`, - usdcTransferCalldata: `0x${string}` - ): Promise<`0x${string}`> { - const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); - const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - - const userOpHash = await this.smartWallet.client.sendUserOperation({ - calls: [ - { - to: SPEND_PERMISSION_MANAGER, - data: spendPermissionCalldata, - value: 0n - }, - { - to: USDC_CONTRACT, - data: usdcTransferCalldata, - value: 0n - } - ], - paymaster: true + // now send the payment to the receiver + this.logger.info(`Sending payment to receiver: ${receiver}`); + // Convert amount to USDC units (6 decimals) as BigInt + const amountInUSDCUnits = BigInt(amount.multipliedBy(10 ** USDC_DECIMALS).toFixed(0)); + + const data = encodeFunctionData({ + abi: ERC20_ABI, + functionName: "transfer", + args: [receiver as Address, amountInUSDCUnits], }); - - this.logger.info(`Smart wallet UserOperation sent: ${userOpHash}`); - return userOpHash; - } - - private async waitForUserOperation(userOpHash: `0x${string}`): Promise { - const receipt = await this.smartWallet.client.waitForUserOperationReceipt({ - hash: userOpHash + const txHash = await this.smartWallet.client.sendUserOperation({ + account: this.smartWallet.account, + calls: [{ + to: USDC_CONTRACT_ADDRESS_BASE, + data: data, + value: parseEther('0'), + }] }); - - if (!receipt.success) { - throw new Error(`UserOperation failed: ${userOpHash}`); - } - - this.logger.info(`UserOperation confirmed: ${userOpHash}`); - return receipt.receipt.transactionHash; - } - - private handleTransactionError(error: unknown, amountBigInt: bigint, receiver: string): void { - console.error('UserOperation failed:', error); - // Add detailed debugging for spend permission errors - if (error instanceof Error && error.message.includes('Execution reverted')) { - console.error('=== SPEND PERMISSION DEBUGGING ==='); - console.error('Spend permission details:'); - console.error('- Account:', this.spendPermission.permission.account); - console.error('- Spender:', this.spendPermission.permission.spender); - console.error('- Token:', this.spendPermission.permission.token); - console.error('- Allowance:', this.spendPermission.permission.allowance); - console.error('- Amount:', amountBigInt.toString()); - console.error('- Receiver:', receiver); - console.error('- Smart Wallet:', this.smartWallet.address); - console.error('- Current Time:', Math.floor(Date.now() / 1000)); - console.error('- Start:', Number(this.spendPermission.permission.start)); - console.error('- End:', Number(this.spendPermission.permission.end)); - console.error('- Is Valid:', Number(this.spendPermission.permission.start) <= Math.floor(Date.now() / 1000) && Math.floor(Date.now() / 1000) <= Number(this.spendPermission.permission.end)); - console.error('- Salt:', this.spendPermission.permission.salt); - console.error('- Extra Data:', this.spendPermission.permission.extraData); - console.error('- Signature Length:', this.spendPermission.signature.length); - console.error('- Signature Preview:', this.spendPermission.signature.substring(0, 100) + '...'); - console.error('=== END DEBUGGING ==='); - } + // Wait for transaction confirmation with more blocks to ensure propagation + this.logger.info(`Waiting for transaction confirmation: ${txHash}`); + const txReceipt = await this.smartWallet.client.waitForUserOperationReceipt({ hash}); - // Try to decode the specific error - if (error instanceof Error && error.message.includes('execution reverted')) { - console.error('The transaction reverted. Possible reasons:'); - console.error('1. The SpendPermissionManager rejected the spend permission'); - console.error('2. The permission signature might be invalid'); - console.error('3. The permission might have already been used (check salt)'); - console.error('4. The smart wallet might not be the correct spender'); - - // Log the permission details again for debugging - console.error('Permission was:', { - account: this.spendPermission.permission.account, - spender: this.spendPermission.permission.spender, - smartWallet: this.smartWallet.address - }); + if (!txReceipt) { + throw new Error('User operation failed'); } - }*/ + this.logger.info(`User operation successful: ${txReceipt.userOpHash}`); + + return hash; + } } diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index e1da28b6..53ca820b 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -31,120 +31,6 @@ function toBase64Url(data: string): string { // Convert base64 to base64url return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } -/* -// Helper function to convert P-256 public key bytes to PEM format -function p256PublicKeyToPEM(publicKeyBytes: string): string { - // Remove 0x prefix if present - const hex = publicKeyBytes.startsWith('0x') ? publicKeyBytes.slice(2) : publicKeyBytes; - - // P-256 public key should be 64 bytes (128 hex chars) - x and y coordinates - if (hex.length !== 128) { - throw new Error(`Invalid P-256 public key length: expected 128 hex chars, got ${hex.length}`); - } - - // Create the DER encoding for a P-256 public key - // This includes the algorithm identifier and the public key point - const algorithmIdentifier = '3059301306072a8648ce3d020106082a8648ce3d030107034200'; - const fullKey = algorithmIdentifier + '04' + hex; // 04 prefix for uncompressed point - - // Convert to base64 - const keyBytes = Buffer.from(fullKey, 'hex'); - const base64 = keyBytes.toString('base64'); - - // Format as PEM - return `-----BEGIN PUBLIC KEY-----\n${base64.match(/.{1,64}/g)?.join('\n')}\n-----END PUBLIC KEY-----`; -} - -// Helper function to validate extracted signature components -function validateSignatureComponents(r: string, s: string): void { - // Check if r or s are all zeros or have too many leading zeros - const rBigInt = BigInt('0x' + r); - const sBigInt = BigInt('0x' + s); - - if (rBigInt === 0n) { - throw new Error('Invalid signature: r component is zero'); - } - - if (sBigInt === 0n) { - throw new Error('Invalid signature: s component is zero'); - } - - // Check if values are suspiciously small (too many leading zeros) - // A valid signature component should use most of its 32 bytes - const rHex = rBigInt.toString(16); - const sHex = sBigInt.toString(16); - - // If the actual value is less than 16 bytes (32 hex chars), it's suspicious - if (rHex.length < 32) { - throw new Error(`Invalid signature: r component suspiciously small (${rHex.length} hex digits)`); - } - - if (sHex.length < 32) { - throw new Error(`Invalid signature: s component suspiciously small (${sHex.length} hex digits)`); - } - - // Check if r and s are within valid range for P-256 curve - const P256_ORDER = BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'); - - if (rBigInt >= P256_ORDER) { - throw new Error('Invalid signature: r component exceeds P-256 curve order'); - } - - if (sBigInt >= P256_ORDER) { - throw new Error('Invalid signature: s component exceeds P-256 curve order'); - } - - // Check for suspicious patterns (e.g., repeated bytes) - const rPattern = r.match(/(.)\1{15,}/); // 16 or more repeated chars - const sPattern = s.match(/(.)\1{15,}/); - - if (rPattern) { - throw new Error(`Invalid signature: r component has suspicious repeated pattern`); - } - - if (sPattern) { - throw new Error(`Invalid signature: s component has suspicious repeated pattern`); - } -} - -// Helper function to extract ES256 signature from WebAuthn data -function extractSignatureFromWebAuthn(webAuthnSignature: string): string { - console.log('\n=== WebAuthn Signature Extraction ==='); - - const hexData = webAuthnSignature.slice(2); // Remove 0x prefix - console.log('Hex data length (without 0x):', hexData.length); - - // Based on analysis of Coinbase Smart Wallet WebAuthn responses, - // the signature r,s values are consistently at these positions: - const R_OFFSET = 576; // Position where r value starts - const S_OFFSET = 640; // Position where s value starts - const SIGNATURE_COMPONENT_LENGTH = 64; // 32 bytes = 64 hex chars - - // Validate that we have enough data - if (hexData.length < S_OFFSET + SIGNATURE_COMPONENT_LENGTH) { - throw new Error(`WebAuthn response too short: expected at least ${S_OFFSET + SIGNATURE_COMPONENT_LENGTH} chars, got ${hexData.length}`); - } - - // Extract r and s values - const r = hexData.substring(R_OFFSET, R_OFFSET + SIGNATURE_COMPONENT_LENGTH); - const s = hexData.substring(S_OFFSET, S_OFFSET + SIGNATURE_COMPONENT_LENGTH); - - console.log('Extracted signature components:'); - console.log('- r:', r); - console.log('- s:', s); - - // Validate the extracted components with the separate validation function - try { - validateSignatureComponents(r, s); - console.log('Signature validation passed'); - } catch (error) { - console.error('Signature validation failed:', error); - throw error; - } - - return `0x${r}${s}`; -} - */ export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; @@ -184,13 +70,6 @@ export class BasePaymentMaker implements PaymentMaker { protected signingClient: ExtendedWalletClient; //protected account: Account; protected logger: Logger; - protected isWebAuthn: boolean = false; // Default to standard EOA auth - - /* - static fromSecretKey(baseRPCUrl: string, sourceSecretKey: Hex, logger?: Logger): BasePaymentMaker { - const account = privateKeyToAccount(sourceSecretKey); - return new BasePaymentMaker(baseRPCUrl, account, logger); - }*/ constructor(baseRPCUrl: string, walletClient: WalletClient, logger?: Logger) { if (!baseRPCUrl) { @@ -213,101 +92,41 @@ export class BasePaymentMaker implements PaymentMaker { } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { - // TODO: Delete isWebAuthn and the entire EIP-1271 block below - we only do payments with EOA wallets - if (this.isWebAuthn) { - // For WebAuthn/Coinbase Smart Wallets, use EIP-1271 instead of JWT - this.logger.info('=== EIP-1271 Authentication Mode ==='); - this.logger.info('Using EIP-1271 signature verification for smart wallet'); - - // Create a structured message for signing - const timestamp = Math.floor(Date.now() / 1000); - const nonce = Math.random().toString(36).substring(2, 15); - - const messageParts = [ - 'PayMCP Authorization Request', - '', - `Wallet: ${this.signingClient.account!.address}`, - `Timestamp: ${timestamp}`, - `Nonce: ${nonce}` - ]; - - if (codeChallenge) { - messageParts.push(`Code Challenge: ${codeChallenge}`); - } - - if (paymentRequestId) { - messageParts.push(`Payment Request ID: ${paymentRequestId}`); - } - - messageParts.push('', '', 'Sign this message to prove you control this wallet.'); - - const message = messageParts.join('\n'); - - this.logger.info(`Message to sign: ${message}`); - - // Sign the message with the wallet (triggers WebAuthn/fingerprint) - const signature = await this.signingClient.signMessage({ - account: this.signingClient.account!, - message: message, - }); - - this.logger.info(`Signature (WebAuthn response): ${signature.substring(0, 100)}...`); - - // Create the auth data object - const authData = { - type: 'EIP1271_AUTH', - walletAddress: this.signingClient.account!.address, - message: message, - signature: signature, - timestamp: timestamp, - nonce: nonce, - ...(codeChallenge ? { code_challenge: codeChallenge } : {}), - ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), - }; - - // Serialize as base64url for transmission (similar to JWT format) - const serialized = toBase64Url(JSON.stringify(authData)); - this.logger.info(`Serialized auth data length: ${serialized.length}`); - this.logger.info(`Serialized auth data: ${serialized}`); - - return serialized; - } else { - // Original JWT logic for regular wallets - const headerObj = { alg: 'ES256K' }; - - const payloadObj = { - sub: this.signingClient.account!.address, - iss: 'accounts.atxp.ai', - aud: 'https://auth.atxp.ai', - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 60 * 60, - ...(codeChallenge ? { code_challenge: codeChallenge } : {}), - ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), - } as Record; - - const header = toBase64Url(JSON.stringify(headerObj)); - const payload = toBase64Url(JSON.stringify(payloadObj)); - const message = `${header}.${payload}`; - - const messageBytes = typeof Buffer !== 'undefined' - ? Buffer.from(message, 'utf8') - : new TextEncoder().encode(message); - - const signResult = await this.signingClient.signMessage({ - account: this.signingClient.account!, - message: { raw: messageBytes }, - }); - - // For ES256K, signature is typically 65 bytes (r,s,v) - // Server expects the hex signature string (with 0x prefix) to be base64url encoded - // This creates: base64url("0x6eb2565...") not base64url(rawBytes) - // Pass the hex string directly to toBase64Url which will UTF-8 encode and base64url it - const signature = toBase64Url(signResult); - - const jwt = `${header}.${payload}.${signature}`; - this.logger.info(`Generated ES256K JWT: ${jwt}`); - return jwt; - } + // Original JWT logic for regular wallets + const headerObj = { alg: 'ES256K' }; + + const payloadObj = { + sub: this.signingClient.account!.address, + iss: 'accounts.atxp.ai', + aud: 'https://auth.atxp.ai', + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + 60 * 60, + ...(codeChallenge ? { code_challenge: codeChallenge } : {}), + ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), + } as Record; + + const header = toBase64Url(JSON.stringify(headerObj)); + const payload = toBase64Url(JSON.stringify(payloadObj)); + const message = `${header}.${payload}`; + + const messageBytes = typeof Buffer !== 'undefined' + ? Buffer.from(message, 'utf8') + : new TextEncoder().encode(message); + + const signResult = await this.signingClient.signMessage({ + account: this.signingClient.account!, + message: { raw: messageBytes }, + }); + + // For ES256K, signature is typically 65 bytes (r,s,v) + // Server expects the hex signature string (with 0x prefix) to be base64url encoded + // This creates: base64url("0x6eb2565...") not base64url(rawBytes) + // Pass the hex string directly to toBase64Url which will UTF-8 encode and base64url it + const signature = toBase64Url(signResult); + + const jwt = `${header}.${payload}.${signature}`; + this.logger.info(`Generated ES256K JWT: ${jwt}`); + return jwt; } async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { From b420a096540a6ca6dbc5aac04bfc2ab66a120adf Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 22:35:25 -0700 Subject: [PATCH 39/53] Signatures from ephemeral smart wallets are still eip1271 --- packages/atxp-base/src/baseAppPaymentMaker.ts | 77 +++++++++++-------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 48fc0ec0..58a0cdfe 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -76,39 +76,56 @@ export class BaseAppPaymentMaker implements PaymentMaker { } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { - const headerObj = { alg: 'ES256K' }; + // Generate EIP-1271 auth data for smart wallet authentication + const timestamp = Math.floor(Date.now() / 1000); + const nonce = Math.random().toString(36).substring(2, 15); // Generate random nonce - const payloadObj = { - sub: this.smartWallet.account.address, - iss: 'accounts.atxp.ai', - aud: 'https://auth.atxp.ai', - iat: Math.floor(Date.now() / 1000), - exp: Math.floor(Date.now() / 1000) + 60 * 60, - ...(codeChallenge ? { code_challenge: codeChallenge } : {}), - ...(paymentRequestId ? { payment_request_id: paymentRequestId } : {}), - } as Record; - - const header = toBase64Url(JSON.stringify(headerObj)); - const payload = toBase64Url(JSON.stringify(payloadObj)); - const message = `${header}.${payload}`; - - const messageBytes = typeof Buffer !== 'undefined' - ? Buffer.from(message, 'utf8') - : new TextEncoder().encode(message); + // Construct the message in the required format + const messageParts = [ + `PayMCP Authorization Request`, + ``, + `Wallet: ${this.smartWallet.account.address}`, + `Timestamp: ${timestamp}`, + `Nonce: ${nonce}` + ]; + + if (codeChallenge) { + messageParts.push(`Code Challenge: ${codeChallenge}`); + } + + if (paymentRequestId) { + messageParts.push(`Payment Request ID: ${paymentRequestId}`); + } + + messageParts.push('', '', 'Sign this message to prove you control this wallet.'); + const message = messageParts.join('\n'); - const signResult = await this.smartWallet.account.signMessage({ - message: { raw: messageBytes }, + // Sign the message - this will return an ABI-encoded signature from the smart wallet + const signature = await this.smartWallet.account.signMessage({ + message: message }); - - // For ES256K, signature is typically 65 bytes (r,s,v) - // Server expects the hex signature string (with 0x prefix) to be base64url encoded - // This creates: base64url("0x6eb2565...") not base64url(rawBytes) - // Pass the hex string directly to toBase64Url which will UTF-8 encode and base64url it - const signature = toBase64Url(signResult); - - const jwt = `${header}.${payload}.${signature}`; - this.logger.info(`Generated ES256K JWT: ${jwt}`); - return jwt; + + // Create EIP-1271 auth data + const authData = { + type: 'EIP1271_AUTH', + walletAddress: this.smartWallet.account.address, + message: message, + signature: signature, + timestamp: timestamp, + nonce: nonce, + ...(codeChallenge && { code_challenge: codeChallenge }), + ...(paymentRequestId && { payment_request_id: paymentRequestId }) + }; + + // Encode as base64url + const encodedAuth = toBase64Url(JSON.stringify(authData)); + + this.logger.info(`codeChallenge: ${codeChallenge}`); + this.logger.info(`paymentRequestId: ${paymentRequestId}`); + this.logger.info(`walletAddress: ${this.smartWallet.account.address}`); + this.logger.info(`Generated EIP-1271 auth data: ${encodedAuth}`); + + return encodedAuth; } async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { From 79ab5e8fbe8a017f436eb19c38239d0969482126 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 22:46:53 -0700 Subject: [PATCH 40/53] So close --- packages/atxp-base/src/baseAppPaymentMaker.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 58a0cdfe..07f1a0ee 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -135,7 +135,10 @@ export class BaseAppPaymentMaker implements PaymentMaker { this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); - const spendCalls = await prepareSpendCallData(this.spendPermission, BigInt(amount.toString())); + // Convert amount to USDC units (6 decimals) as BigInt for spendPermission + const amountInUSDCUnits = BigInt(amount.multipliedBy(10 ** USDC_DECIMALS).toFixed(0)); + const spendCalls = await prepareSpendCallData(this.spendPermission, amountInUSDCUnits); + this.logger.info(`spendCalls: ${JSON.stringify(spendCalls)}`); const hash = await this.smartWallet.client.sendUserOperation({ account: this.smartWallet.account, calls: spendCalls.map(call => { @@ -157,8 +160,6 @@ export class BaseAppPaymentMaker implements PaymentMaker { // now send the payment to the receiver this.logger.info(`Sending payment to receiver: ${receiver}`); - // Convert amount to USDC units (6 decimals) as BigInt - const amountInUSDCUnits = BigInt(amount.multipliedBy(10 ** USDC_DECIMALS).toFixed(0)); const data = encodeFunctionData({ abi: ERC20_ABI, From 014ea8fb264e13dd190d6cb0d759558df4490c2e Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 23:03:47 -0700 Subject: [PATCH 41/53] End-to-end works (modulo address-match bug in JWT) --- packages/atxp-base/src/baseAppPaymentMaker.ts | 103 ++++++++---------- 1 file changed, 45 insertions(+), 58 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 07f1a0ee..ead473b3 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,7 +1,7 @@ import type { PaymentMaker } from '@atxp/client'; import { Logger, Currency, ConsoleLogger } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { encodeFunctionData, Address, getAddress, Account, WalletClient, http, createWalletClient, parseEther } from 'viem'; +import { Address, parseEther } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { base } from 'viem/chains'; @@ -17,39 +17,38 @@ function toBase64Url(data: string): string { return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } -const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; -const ERC20_ABI = [ - { - constant: false, - inputs: [ - { name: "_to", type: "address" }, - { name: "_value", type: "uint256" }, - ], - name: "transfer", - outputs: [{ name: "", type: "bool" }], - type: "function", - }, - { - "constant": true, - "inputs": [ - { - "name": "_owner", - "type": "address" - } - ], - "name": "balanceOf", - "outputs": [ - { - "name": "balance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" + +/** + * Wait for a transaction to be confirmed with the specified number of confirmations + * @param smartWallet The smart wallet instance + * @param txHash The transaction hash to wait for + * @param confirmations Number of confirmations to wait for + * @param logger Logger instance for logging + */ +async function waitForTransactionConfirmations( + smartWallet: EphemeralSmartWallet, + txHash: string, + confirmations: number, + logger: Logger +): Promise { + try { + const publicClient = smartWallet.client.account?.client; + if (publicClient && 'waitForTransactionReceipt' in publicClient) { + logger.info(`Waiting for ${confirmations} confirmations...`); + await (publicClient as any).waitForTransactionReceipt({ + hash: txHash, + confirmations: confirmations + }); + logger.info(`Transaction confirmed with ${confirmations} confirmations`); + } else { + logger.warn('Unable to wait for confirmations: client does not support waitForTransactionReceipt'); + } + } catch (error) { + logger.warn(`Could not wait for additional confirmations: ${error}`); + // Continue anyway - the transaction is already mined } -]; +} export class BaseAppPaymentMaker implements PaymentMaker { private logger: Logger; @@ -156,34 +155,22 @@ export class BaseAppPaymentMaker implements PaymentMaker { if (!receipt) { throw new Error('User operation failed'); } - this.logger.info(`User operation successful: ${receipt.userOpHash}`); - - // now send the payment to the receiver - this.logger.info(`Sending payment to receiver: ${receiver}`); - - const data = encodeFunctionData({ - abi: ERC20_ABI, - functionName: "transfer", - args: [receiver as Address, amountInUSDCUnits], - }); - const txHash = await this.smartWallet.client.sendUserOperation({ - account: this.smartWallet.account, - calls: [{ - to: USDC_CONTRACT_ADDRESS_BASE, - data: data, - value: parseEther('0'), - }] - }); - // Wait for transaction confirmation with more blocks to ensure propagation - this.logger.info(`Waiting for transaction confirmation: ${txHash}`); - const txReceipt = await this.smartWallet.client.waitForUserOperationReceipt({ hash}); + // The receipt contains the actual transaction hash that was mined on chain + const txHash = receipt.receipt.transactionHash; - if (!txReceipt) { - throw new Error('User operation failed'); + if (!txHash) { + throw new Error('User operation was executed but no transaction hash was returned. This should not happen.'); } - this.logger.info(`User operation successful: ${txReceipt.userOpHash}`); - - return hash; + + this.logger.info(`Spend permission executed successfully. UserOp: ${receipt.userOpHash}, TxHash: ${txHash}`); + + // Wait for additional confirmations to ensure the transaction is well-propagated + // This helps avoid the "Transaction receipt could not be found" error + await waitForTransactionConfirmations(this.smartWallet, txHash, 3, this.logger); + + // Return the actual transaction hash, not the user operation hash + // The payment verification system needs the on-chain transaction hash + return txHash; } } From bc90fdf247e992023b3f13daed28cf30e2f0e724 Mon Sep 17 00:00:00 2001 From: bdj Date: Mon, 25 Aug 2025 23:41:22 -0700 Subject: [PATCH 42/53] Also include transfer to receiver in payment... --- packages/atxp-base/src/baseAppPaymentMaker.ts | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index ead473b3..5a705885 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,7 +1,7 @@ import type { PaymentMaker } from '@atxp/client'; import { Logger, Currency, ConsoleLogger } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; -import { Address, parseEther } from 'viem'; +import { Address, parseEther, encodeFunctionData } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { base } from 'viem/chains'; @@ -18,6 +18,21 @@ function toBase64Url(data: string): string { } const USDC_DECIMALS = 6; +const USDC_CONTRACT_ADDRESS_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; + +// Minimal ERC20 ABI for transfer function +const ERC20_ABI = [ + { + inputs: [ + { name: 'to', type: 'address' }, + { name: 'amount', type: 'uint256' } + ], + name: 'transfer', + outputs: [{ name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + } +] as const; /** * Wait for a transaction to be confirmed with the specified number of confirmations @@ -132,21 +147,34 @@ export class BaseAppPaymentMaker implements PaymentMaker { throw new Error('Only usdc currency is supported; received ' + currency); } - this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ephemeral wallet on Base`); + this.logger.info(`Making spendPermission payment of ${amount} ${currency} to ${receiver} on Base`); // Convert amount to USDC units (6 decimals) as BigInt for spendPermission const amountInUSDCUnits = BigInt(amount.multipliedBy(10 ** USDC_DECIMALS).toFixed(0)); const spendCalls = await prepareSpendCallData(this.spendPermission, amountInUSDCUnits); - this.logger.info(`spendCalls: ${JSON.stringify(spendCalls)}`); + + // Add a second call to transfer USDC from the smart wallet to the receiver + const transferCall = { + to: USDC_CONTRACT_ADDRESS_BASE as `0x${string}`, + data: encodeFunctionData({ + abi: ERC20_ABI, + functionName: "transfer", + args: [receiver as Address, amountInUSDCUnits], + }), + value: '0x0' as `0x${string}` + }; + + // Combine spend permission calls with the transfer call + const allCalls = [...spendCalls, transferCall]; + + this.logger.info(`Executing ${allCalls.length} calls (${spendCalls.length} spend permission + 1 transfer)`); const hash = await this.smartWallet.client.sendUserOperation({ account: this.smartWallet.account, - calls: spendCalls.map(call => { + calls: allCalls.map(call => { return { - chain: base, - to: call.to, - data: call.data, - value: parseEther('0'), - account: this.smartWallet.account + to: call.to as `0x${string}`, + data: call.data as `0x${string}`, + value: BigInt(call.value || '0x0') } }) }) From b03b54f4de75075e6f1e3c895ef6bb0a06942a17 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 09:19:55 -0700 Subject: [PATCH 43/53] npm install --workspaces after rebase --- package-lock.json | 9587 +++++++++++++++++---------------------------- 1 file changed, 3645 insertions(+), 5942 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e55c7c2..f85bd439 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,9 +37,7 @@ } }, "node_modules/@0no-co/graphql.web": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", - "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", + "version": "1.1.2", "license": "MIT", "peer": true, "peerDependencies": { @@ -53,14 +51,10 @@ }, "node_modules/@adraffy/ens-normalize": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", - "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==", "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -73,8 +67,6 @@ }, "node_modules/@asamuzakjp/css-color": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", "dev": true, "license": "MIT", "dependencies": { @@ -87,8 +79,6 @@ }, "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "license": "ISC" }, @@ -104,38 +94,33 @@ "resolved": "packages/atxp-common", "link": true }, -<<<<<<< HEAD "node_modules/@atxp/redis": { "resolved": "packages/atxp-redis", "link": true }, -======= ->>>>>>> a1d033e (npm install) "node_modules/@atxp/server": { "resolved": "packages/atxp-server", "link": true }, -<<<<<<< HEAD "node_modules/@atxp/sqlite": { "resolved": "packages/atxp-sqlite", "link": true }, -======= ->>>>>>> a1d033e (npm install) "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.27.5", "license": "MIT", "peer": true, "engines": { @@ -143,22 +128,20 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.27.4", "license": "MIT", "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -173,45 +156,8 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -219,16 +165,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.27.5", "license": "MIT", "peer": true, "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { @@ -237,8 +181,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", "peer": true, "dependencies": { @@ -250,8 +192,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "peer": true, "dependencies": { @@ -267,8 +207,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -276,18 +214,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -299,8 +235,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -309,8 +243,6 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "license": "MIT", "peer": true, "dependencies": { @@ -327,8 +259,6 @@ }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -336,36 +266,22 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "version": "0.6.4", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "debug": "^4.4.1", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.22.10" + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "peer": true, "dependencies": { @@ -378,8 +294,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "peer": true, "dependencies": { @@ -391,15 +305,13 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.27.3", "license": "MIT", "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -410,8 +322,6 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "peer": true, "dependencies": { @@ -423,8 +333,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "peer": true, "engines": { @@ -433,8 +341,6 @@ }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "peer": true, "dependencies": { @@ -451,8 +357,6 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "peer": true, "dependencies": { @@ -469,8 +373,6 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "peer": true, "dependencies": { @@ -483,8 +385,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "peer": true, "engines": { @@ -493,8 +393,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "peer": true, "engines": { @@ -503,8 +401,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "peer": true, "engines": { @@ -512,29 +408,25 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", - "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.27.4", "license": "MIT", "peer": true, "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -542,8 +434,6 @@ }, "node_modules/@babel/highlight": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "license": "MIT", "peer": true, "dependencies": { @@ -558,8 +448,6 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "peer": true, "dependencies": { @@ -571,8 +459,6 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "peer": true, "dependencies": { @@ -586,8 +472,6 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "peer": true, "dependencies": { @@ -596,15 +480,11 @@ }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT", "peer": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "peer": true, "engines": { @@ -613,25 +493,14 @@ }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "peer": true, "engines": { "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "peer": true, "dependencies": { @@ -642,13 +511,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.27.5", "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -658,9 +525,7 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", - "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { @@ -677,8 +542,6 @@ }, "node_modules/@babel/plugin-proposal-export-default-from": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", - "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", "license": "MIT", "peer": true, "dependencies": { @@ -693,8 +556,6 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "license": "MIT", "peer": true, "dependencies": { @@ -706,8 +567,6 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "license": "MIT", "peer": true, "dependencies": { @@ -719,8 +578,6 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "license": "MIT", "peer": true, "dependencies": { @@ -732,8 +589,6 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "license": "MIT", "peer": true, "dependencies": { @@ -748,8 +603,6 @@ }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "license": "MIT", "peer": true, "dependencies": { @@ -764,8 +617,6 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "license": "MIT", "peer": true, "dependencies": { @@ -777,8 +628,6 @@ }, "node_modules/@babel/plugin-syntax-export-default-from": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", - "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", "license": "MIT", "peer": true, "dependencies": { @@ -793,8 +642,6 @@ }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", - "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", "peer": true, "dependencies": { @@ -809,8 +656,6 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "license": "MIT", "peer": true, "dependencies": { @@ -825,8 +670,6 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "license": "MIT", "peer": true, "dependencies": { @@ -838,8 +681,6 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "license": "MIT", "peer": true, "dependencies": { @@ -851,8 +692,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", "peer": true, "dependencies": { @@ -867,8 +706,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "license": "MIT", "peer": true, "dependencies": { @@ -880,8 +717,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "license": "MIT", "peer": true, "dependencies": { @@ -893,8 +728,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "license": "MIT", "peer": true, "dependencies": { @@ -906,8 +739,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "license": "MIT", "peer": true, "dependencies": { @@ -919,8 +750,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "license": "MIT", "peer": true, "dependencies": { @@ -932,8 +761,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "license": "MIT", "peer": true, "dependencies": { @@ -945,8 +772,6 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "license": "MIT", "peer": true, "dependencies": { @@ -961,8 +786,6 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "license": "MIT", "peer": true, "dependencies": { @@ -977,8 +800,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "license": "MIT", "peer": true, "dependencies": { @@ -993,8 +814,6 @@ }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "peer": true, "dependencies": { @@ -1008,15 +827,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1027,8 +844,6 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "license": "MIT", "peer": true, "dependencies": { @@ -1044,9 +859,7 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.27.5", "license": "MIT", "peer": true, "dependencies": { @@ -1061,8 +874,6 @@ }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", "peer": true, "dependencies": { @@ -1077,18 +888,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-globals": "^7.28.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.27.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1099,8 +908,6 @@ }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", "peer": true, "dependencies": { @@ -1115,14 +922,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.27.3", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1133,8 +937,6 @@ }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1149,8 +951,6 @@ }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", - "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "license": "MIT", "peer": true, "dependencies": { @@ -1166,8 +966,6 @@ }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "peer": true, "dependencies": { @@ -1183,8 +981,6 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1201,8 +997,6 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "peer": true, "dependencies": { @@ -1217,8 +1011,6 @@ }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "license": "MIT", "peer": true, "dependencies": { @@ -1233,8 +1025,6 @@ }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "peer": true, "dependencies": { @@ -1250,8 +1040,6 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "peer": true, "dependencies": { @@ -1267,8 +1055,6 @@ }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "license": "MIT", "peer": true, "dependencies": { @@ -1283,8 +1069,6 @@ }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "license": "MIT", "peer": true, "dependencies": { @@ -1298,17 +1082,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.27.3", "license": "MIT", "peer": true, "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/plugin-transform-destructuring": "^7.27.3", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1319,8 +1100,6 @@ }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "license": "MIT", "peer": true, "dependencies": { @@ -1335,8 +1114,6 @@ }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "peer": true, "dependencies": { @@ -1351,9 +1128,7 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { @@ -1368,8 +1143,6 @@ }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "license": "MIT", "peer": true, "dependencies": { @@ -1385,8 +1158,6 @@ }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1402,9 +1173,7 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", - "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { @@ -1419,8 +1188,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", "peer": true, "dependencies": { @@ -1439,8 +1206,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "peer": true, "dependencies": { @@ -1455,8 +1220,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "license": "MIT", "peer": true, "dependencies": { @@ -1471,8 +1234,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "license": "MIT", "peer": true, "dependencies": { @@ -1487,8 +1248,6 @@ }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "peer": true, "dependencies": { @@ -1503,9 +1262,7 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.27.5", "license": "MIT", "peer": true, "dependencies": { @@ -1519,17 +1276,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", - "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "version": "7.27.4", "license": "MIT", "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.14", - "babel-plugin-polyfill-corejs3": "^0.13.0", - "babel-plugin-polyfill-regenerator": "^0.6.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1541,8 +1296,6 @@ }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -1551,8 +1304,6 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1567,8 +1318,6 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "license": "MIT", "peer": true, "dependencies": { @@ -1584,8 +1333,6 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "peer": true, "dependencies": { @@ -1599,13 +1346,11 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", - "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "version": "7.27.1", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -1620,8 +1365,6 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "peer": true, "dependencies": { @@ -1637,8 +1380,6 @@ }, "node_modules/@babel/preset-react": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", "license": "MIT", "peer": true, "dependencies": { @@ -1658,8 +1399,6 @@ }, "node_modules/@babel/preset-typescript": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "license": "MIT", "peer": true, "dependencies": { @@ -1677,9 +1416,7 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.27.1", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1687,8 +1424,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "peer": true, "dependencies": { @@ -1700,42 +1435,18 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.27.4", "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1743,72 +1454,24 @@ }, "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.27.4", "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/types": "^7.27.3", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.27.3", "license": "MIT", "peer": true, "dependencies": { @@ -1821,8 +1484,6 @@ }, "node_modules/@base-org/account": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@base-org/account/-/account-2.0.2.tgz", - "integrity": "sha512-p/mefIVfiKxDYWIoZSp1VeCXmh3hqmaD8ThS7YKMnuxljfM6dOJTxvUpZ/emkXvQQa1nnCA+TRVZt1nCrs5ACA==", "license": "Apache-2.0", "dependencies": { "@noble/hashes": "1.4.0", @@ -1837,8 +1498,6 @@ }, "node_modules/@base-org/account/node_modules/@noble/hashes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "license": "MIT", "engines": { "node": ">= 16" @@ -1849,8 +1508,6 @@ }, "node_modules/@base-org/account/node_modules/ox": { "version": "0.6.9", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", - "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", "funding": [ { "type": "github", @@ -1878,8 +1535,6 @@ }, "node_modules/@base-org/account/node_modules/ox/node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1889,9 +1544,7 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", - "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "version": "5.0.2", "dev": true, "funding": [ { @@ -1910,8 +1563,6 @@ }, "node_modules/@csstools/css-calc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", "dev": true, "funding": [ { @@ -1933,9 +1584,7 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", - "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "version": "3.0.10", "dev": true, "funding": [ { @@ -1949,7 +1598,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.1.0", + "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.4" }, "engines": { @@ -1962,8 +1611,6 @@ }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "funding": [ { @@ -1985,8 +1632,6 @@ }, "node_modules/@csstools/css-tokenizer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, "funding": [ { @@ -2003,767 +1648,712 @@ "node": ">=18" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array": { + "version": "0.21.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/core": { + "version": "0.15.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 4" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", - "cpu": [ - "ia32" - ], + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", - "cpu": [ - "mips64el" - ], + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", - "cpu": [ - "ppc64" - ], + "node_modules/@eslint/js": { + "version": "9.32.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", - "cpu": [ - "riscv64" - ], + "node_modules/@eslint/object-schema": { + "version": "2.1.6", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", - "cpu": [ - "s390x" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.3.4", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@expo/cli": { + "version": "0.24.13", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "@0no-co/graphql.web": "^1.0.8", + "@babel/runtime": "^7.20.0", + "@expo/code-signing-certificates": "^0.0.5", + "@expo/config": "~11.0.10", + "@expo/config-plugins": "~10.0.2", + "@expo/devcert": "^1.1.2", + "@expo/env": "~1.0.5", + "@expo/image-utils": "^0.7.4", + "@expo/json-file": "^9.1.4", + "@expo/metro-config": "~0.20.14", + "@expo/osascript": "^2.2.4", + "@expo/package-manager": "^1.8.4", + "@expo/plist": "^0.3.4", + "@expo/prebuild-config": "^9.0.6", + "@expo/spawn-async": "^1.7.2", + "@expo/ws-tunnel": "^1.0.1", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "0.79.2", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", + "accepts": "^1.3.8", + "arg": "^5.0.2", + "better-opn": "~3.0.2", + "bplist-creator": "0.1.0", + "bplist-parser": "^0.3.1", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "freeport-async": "^2.0.0", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "lan-network": "^0.1.6", + "minimatch": "^9.0.0", + "node-forge": "^1.3.1", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.3", + "semver": "^7.6.0", + "send": "^0.19.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^7.4.3", + "terminal-link": "^2.1.1", + "undici": "^6.18.2", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@expo/cli/node_modules/@react-native/debugger-frontend": { + "version": "0.79.2", + "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/@react-native/dev-middleware": { + "version": "0.79.2", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.79.2", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "peer": true }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/accepts": { + "version": "1.3.8", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, "engines": { - "node": ">=18" + "node": ">= 0.6" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@expo/cli/node_modules/brace-expansion": { + "version": "2.0.2", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, + "node_modules/@expo/cli/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", + "peer": true, "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, + "node_modules/@expo/cli/node_modules/fresh": { + "version": "0.5.2", "license": "MIT", + "peer": true, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">= 0.6" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/cli/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "peer": true, "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.6" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/@expo/cli/node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "node_modules/@expo/cli/node_modules/minimatch": { + "version": "9.0.5", "license": "ISC", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/cli/node_modules/picomatch": { + "version": "3.0.1", + "license": "MIT", + "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/cli/node_modules/send": { + "version": "0.19.1", + "license": "MIT", + "peer": true, "dependencies": { - "@types/json-schema": "^7.0.15" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.8.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, + "node_modules/@expo/cli/node_modules/send/node_modules/debug": { + "version": "2.6.9", "license": "MIT", + "peer": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.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" + "ms": "2.0.0" + } + }, + "node_modules/@expo/cli/node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/@expo/cli/node_modules/serve-static": { + "version": "1.16.2", + "license": "MIT", + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/@expo/cli/node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "ms": "2.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, + "node_modules/@expo/cli/node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", "license": "MIT", - "engines": { - "node": ">= 4" - } + "peer": true }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@expo/cli/node_modules/serve-static/node_modules/send": { + "version": "0.19.0", + "license": "MIT", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": "*" + "node": ">= 0.8.0" } }, - "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", - "dev": true, + "node_modules/@expo/cli/node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", "license": "MIT", + "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.8" + } + }, + "node_modules/@expo/cli/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://eslint.org/donate" + "engines": { + "node": ">=8" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/cli/node_modules/ws": { + "version": "8.18.2", + "license": "MIT", + "peer": true, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "license": "MIT", + "peer": true, "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" } }, - "node_modules/@expo/cli": { - "version": "0.24.20", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.20.tgz", - "integrity": "sha512-uF1pOVcd+xizNtVTuZqNGzy7I6IJon5YMmQidsURds1Ww96AFDxrR/NEACqeATNAmY60m8wy1VZZpSg5zLNkpw==", + "node_modules/@expo/config": { + "version": "11.0.12", "license": "MIT", "peer": true, "dependencies": { - "@0no-co/graphql.web": "^1.0.8", - "@babel/runtime": "^7.20.0", - "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/devcert": "^1.1.2", - "@expo/env": "~1.0.7", - "@expo/image-utils": "^0.7.6", + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~10.1.1", + "@expo/config-types": "^53.0.5", "@expo/json-file": "^9.1.5", - "@expo/metro-config": "~0.20.17", - "@expo/osascript": "^2.2.5", - "@expo/package-manager": "^1.8.6", - "@expo/plist": "^0.3.5", - "@expo/prebuild-config": "^9.0.11", - "@expo/spawn-async": "^1.7.2", - "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.79.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", - "accepts": "^1.3.8", - "arg": "^5.0.2", - "better-opn": "~3.0.2", - "bplist-creator": "0.1.0", - "bplist-parser": "^0.3.1", - "chalk": "^4.0.0", - "ci-info": "^3.3.0", - "compression": "^1.7.4", - "connect": "^3.7.0", - "debug": "^4.3.4", - "env-editor": "^0.4.1", - "freeport-async": "^2.0.0", + "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^10.4.2", - "lan-network": "^0.1.6", - "minimatch": "^9.0.0", - "node-forge": "^1.3.1", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "picomatch": "^3.0.1", - "pretty-bytes": "^5.6.0", - "pretty-format": "^29.7.0", - "progress": "^2.0.3", - "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", + "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", - "send": "^0.19.0", "slugify": "^1.3.4", - "source-map-support": "~0.5.21", - "stacktrace-parser": "^0.1.10", - "structured-headers": "^0.4.1", - "tar": "^7.4.3", - "terminal-link": "^2.1.1", - "undici": "^6.18.2", - "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" + "sucrase": "3.35.0" + } + }, + "node_modules/@expo/config-plugins": { + "version": "10.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@expo/config-types": "^53.0.3", + "@expo/json-file": "~9.1.4", + "@expo/plist": "^0.3.4", + "@expo/sdk-runtime-versions": "^1.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.5", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "resolve-from": "^5.0.0", + "semver": "^7.5.4", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" }, - "bin": { - "expo-internal": "build/bin/cli" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/cli/node_modules/picomatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", - "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "node_modules/@expo/config-plugins/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/cli/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", + "node_modules/@expo/config-plugins/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-plugins/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/code-signing-certificates": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", - "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "node_modules/@expo/config-plugins/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "node-forge": "^1.2.1", - "nullthrows": "^1.1.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@expo/config": { - "version": "11.0.13", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-11.0.13.tgz", - "integrity": "sha512-TnGb4u/zUZetpav9sx/3fWK71oCPaOjZHoVED9NaEncktAd0Eonhq5NUghiJmkUGt3gGSjRAEBXiBbbY9/B1LA==", + "node_modules/@expo/config-types": { + "version": "53.0.5", + "license": "MIT", + "peer": true + }, + "node_modules/@expo/config/node_modules/@babel/code-frame": { + "version": "7.10.4", "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~10.1.2", - "@expo/config-types": "^53.0.5", - "@expo/json-file": "^9.1.5", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "3.35.0" + "@babel/highlight": "^7.10.4" } }, - "node_modules/@expo/config-plugins": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.1.2.tgz", - "integrity": "sha512-IMYCxBOcnuFStuK0Ay+FzEIBKrwW8OVUMc65+v0+i7YFIIe8aL342l7T4F8lR4oCfhXn7d6M5QPgXvjtc/gAcw==", + "node_modules/@expo/config/node_modules/@expo/config-plugins": { + "version": "10.1.1", "license": "MIT", "peer": true, "dependencies": { @@ -2783,210 +2373,197 @@ "xml2js": "0.6.0" } }, - "node_modules/@expo/config-plugins/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@expo/config/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/config-types": { - "version": "53.0.5", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-53.0.5.tgz", - "integrity": "sha512-kqZ0w44E+HEGBjy+Lpyn0BVL5UANg/tmNixxaRMLS6nf37YsDrLk2VMAmeKMMk5CKG0NmOdVv3ngeUjRQMsy9g==", - "license": "MIT", - "peer": true - }, - "node_modules/@expo/config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@expo/config/node_modules/brace-expansion": { + "version": "2.0.2", "license": "MIT", "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/@expo/devcert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.0.tgz", - "integrity": "sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA==", + "node_modules/@expo/config/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "@expo/sudo-prompt": "^9.3.1", - "debug": "^3.1.0", - "glob": "^10.4.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/devcert/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@expo/config/node_modules/getenv": { + "version": "2.0.0", "license": "MIT", "peer": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=6" } }, - "node_modules/@expo/env": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-1.0.7.tgz", - "integrity": "sha512-qSTEnwvuYJ3umapO9XJtrb1fAqiPlmUUg78N0IZXXGwQRt+bkp0OBls+Y5Mxw/Owj8waAM0Z3huKKskRADR5ow==", - "license": "MIT", + "node_modules/@expo/config/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", "peer": true, "dependencies": { - "chalk": "^4.0.0", - "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/env/node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", + "node_modules/@expo/config/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/fingerprint": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.13.4.tgz", - "integrity": "sha512-MYfPYBTMfrrNr07DALuLhG6EaLVNVrY/PXjEzsjWdWE4ZFn0yqI0IdHNkJG7t1gePT8iztHc7qnsx+oo/rDo6w==", + "node_modules/@expo/config/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "@expo/spawn-async": "^1.7.2", - "arg": "^5.0.2", - "chalk": "^4.1.2", - "debug": "^4.3.4", - "find-up": "^5.0.0", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "ignore": "^5.3.1", - "minimatch": "^9.0.0", - "p-limit": "^3.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0" + "has-flag": "^4.0.0" }, - "bin": { - "fingerprint": "bin/cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/@expo/fingerprint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@expo/devcert": { + "version": "1.2.0", "license": "MIT", "peer": true, - "engines": { - "node": ">= 4" + "dependencies": { + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0", + "glob": "^10.4.2" } }, - "node_modules/@expo/fingerprint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@expo/devcert/node_modules/brace-expansion": { + "version": "2.0.2", "license": "MIT", "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/@expo/image-utils": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.7.6.tgz", - "integrity": "sha512-GKnMqC79+mo/1AFrmAcUcGfbsXXTRqOMNS1umebuevl3aaw+ztsYEFEiuNhHZW7PQ3Xs3URNT513ZxKhznDscw==", + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", "license": "MIT", "peer": true, "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "getenv": "^2.0.0", - "jimp-compact": "0.16.1", - "parse-png": "^2.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "temp-dir": "~2.0.0", - "unique-string": "~2.0.0" + "ms": "^2.1.1" } }, - "node_modules/@expo/image-utils/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", + "node_modules/@expo/devcert/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/devcert/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/json-file": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.1.5.tgz", - "integrity": "sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA==", + "node_modules/@expo/env": { + "version": "1.0.5", "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "~7.10.4", - "json5": "^2.2.3" + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^1.0.0" } }, - "node_modules/@expo/json-file/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/@expo/env/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/metro-config": { - "version": "0.20.17", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.20.17.tgz", - "integrity": "sha512-lpntF2UZn5bTwrPK6guUv00Xv3X9mkN3YYla+IhEHiYXWyG7WKOtDU0U4KR8h3ubkZ6SPH3snDyRyAzMsWtZFA==", + "node_modules/@expo/env/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", - "@expo/config": "~11.0.12", - "@expo/env": "~1.0.7", - "@expo/json-file": "~9.1.5", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^10.4.2", - "jsc-safe-url": "^0.2.4", - "lightningcss": "~1.27.0", - "minimatch": "^9.0.0", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/metro-config/node_modules/dotenv": { + "node_modules/@expo/env/node_modules/dotenv": { "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "peer": true, "engines": { @@ -2996,1532 +2573,1516 @@ "url": "https://dotenvx.com" } }, - "node_modules/@expo/metro-config/node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/@expo/env/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "has-flag": "^4.0.0" }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@expo/metro-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, - "node_modules/@expo/osascript": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.2.5.tgz", - "integrity": "sha512-Bpp/n5rZ0UmpBOnl7Li3LtM7la0AR3H9NNesqL+ytW5UiqV/TbonYW3rDZY38u4u/lG7TnYflVIVQPD+iqZJ5w==", + "node_modules/@expo/fingerprint": { + "version": "0.12.4", "license": "MIT", "peer": true, "dependencies": { "@expo/spawn-async": "^1.7.2", - "exec-async": "^2.2.0" + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "find-up": "^5.0.0", + "getenv": "^1.0.0", + "minimatch": "^9.0.0", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" }, - "engines": { - "node": ">=12" + "bin": { + "fingerprint": "bin/cli.js" } }, - "node_modules/@expo/package-manager": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.8.6.tgz", - "integrity": "sha512-gcdICLuL+nHKZagPIDC5tX8UoDDB8vNA5/+SaQEqz8D+T2C4KrEJc2Vi1gPAlDnKif834QS6YluHWyxjk0yZlQ==", + "node_modules/@expo/fingerprint/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "@expo/json-file": "^9.1.5", - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.0.0", - "npm-package-arg": "^11.0.0", - "ora": "^3.4.0", - "resolve-workspace-root": "^2.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@expo/plist": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.3.5.tgz", - "integrity": "sha512-9RYVU1iGyCJ7vWfg3e7c/NVyMFs8wbl+dMWZphtFtsqyN9zppGREU3ctlD3i8KUE0sCUTVnLjCWr+VeUIDep2g==", + "node_modules/@expo/fingerprint/node_modules/brace-expansion": { + "version": "2.0.2", "license": "MIT", "peer": true, "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" + "balanced-match": "^1.0.0" } }, - "node_modules/@expo/prebuild-config": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-9.0.11.tgz", - "integrity": "sha512-0DsxhhixRbCCvmYskBTq8czsU0YOBsntYURhWPNpkl0IPVpeP9haE5W4OwtHGzXEbmHdzaoDwNmVcWjS/mqbDw==", + "node_modules/@expo/fingerprint/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/config-types": "^53.0.5", - "@expo/image-utils": "^0.7.6", - "@expo/json-file": "^9.1.5", - "@react-native/normalize-colors": "0.79.5", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@expo/prebuild-config/node_modules/resolve-from": { + "node_modules/@expo/fingerprint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@expo/sdk-runtime-versions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", - "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@expo/spawn-async": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", - "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "node_modules/@expo/fingerprint/node_modules/locate-path": { + "version": "6.0.0", "license": "MIT", "peer": true, "dependencies": { - "cross-spawn": "^7.0.3" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@expo/sudo-prompt": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", - "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", - "license": "MIT", - "peer": true - }, - "node_modules/@expo/vector-icons": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.1.0.tgz", - "integrity": "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==", - "license": "MIT", + "node_modules/@expo/fingerprint/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "peer": true, - "peerDependencies": { - "expo-font": "*", - "react": "*", - "react-native": "*" + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@expo/ws-tunnel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@expo/ws-tunnel/-/ws-tunnel-1.0.6.tgz", - "integrity": "sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==", + "node_modules/@expo/fingerprint/node_modules/p-limit": { + "version": "3.1.0", "license": "MIT", - "peer": true - }, - "node_modules/@expo/xcpretty": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", - "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", - "license": "BSD-3-Clause", "peer": true, "dependencies": { - "@babel/code-frame": "7.10.4", - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "js-yaml": "^4.1.0" + "yocto-queue": "^0.1.0" }, - "bin": { - "excpretty": "build/cli.js" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=18.18.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@expo/fingerprint/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "peer": true, "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "node_modules/@expo/fingerprint/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=8" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", + "node_modules/@expo/image-utils": { + "version": "0.7.4", + "license": "MIT", "peer": true, "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" - }, - "engines": { - "node": ">=12" + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "getenv": "^1.0.0", + "jimp-compact": "0.16.1", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "temp-dir": "~2.0.0", + "unique-string": "~2.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@expo/image-utils/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@expo/image-utils/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", + "node_modules/@expo/image-utils/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", "peer": true, "dependencies": { - "minipass": "^7.0.4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "license": "ISC", + "node_modules/@expo/json-file": { + "version": "9.1.5", + "license": "MIT", "peer": true, - "engines": { - "node": ">=12" + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "license": "ISC", + "node_modules/@expo/json-file/node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", "peer": true, "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" + "@babel/highlight": "^7.10.4" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@expo/metro-config": { + "version": "0.20.14", "license": "MIT", "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "@expo/config": "~11.0.9", + "@expo/env": "~1.0.5", + "@expo/json-file": "~9.1.4", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^1.0.0", + "glob": "^10.4.2", + "jsc-safe-url": "^0.2.4", + "lightningcss": "~1.27.0", + "minimatch": "^9.0.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@expo/metro-config/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@expo/metro-config/node_modules/brace-expansion": { + "version": "2.0.2", "license": "MIT", "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "balanced-match": "^1.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@expo/metro-config/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "p-locate": "^4.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", + "node_modules/@expo/metro-config/node_modules/dotenv": { + "version": "16.4.7", + "license": "BSD-2-Clause", "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://dotenvx.com" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", + "node_modules/@expo/metro-config/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=8" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", + "node_modules/@expo/metro-config/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@expo/metro-config/node_modules/postcss": { + "version": "8.4.49", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "peer": true, + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "node_modules/@expo/metro-config/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "@jest/types": "^29.6.3" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@expo/osascript": { + "version": "2.2.4", "license": "MIT", "peer": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "@expo/spawn-async": "^1.7.2", + "exec-async": "^2.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@expo/package-manager": { + "version": "1.8.4", "license": "MIT", "peer": true, "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@expo/json-file": "^9.1.4", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@expo/package-manager/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "@sinclair/typebox": "^0.27.8" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@expo/package-manager/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@expo/package-manager/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@expo/plist": { + "version": "0.3.5", "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.2.3", + "xmlbuilder": "^15.1.1" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@expo/prebuild-config": { + "version": "9.0.6", "license": "MIT", "peer": true, - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@expo/config": "~11.0.9", + "@expo/config-plugins": "~10.0.2", + "@expo/config-types": "^53.0.4", + "@expo/image-utils": "^0.7.4", + "@expo/json-file": "^9.1.4", + "@react-native/normalize-colors": "0.79.2", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { + "version": "0.79.2", + "license": "MIT", + "peer": true + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/@expo/spawn-async": { + "version": "1.7.2", "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" + "node_modules/@expo/sudo-prompt": { + "version": "9.3.2", + "license": "MIT", + "peer": true }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "node_modules/@expo/vector-icons": { + "version": "14.1.0", "license": "MIT", "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "peerDependencies": { + "expo-font": "*", + "react": "*", + "react-native": "*" } }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.4.tgz", - "integrity": "sha512-zq24hfuAmmlNZvik0FLI58uE5sriN0WWsQzIlYnzSuKDAHFqJtBFrl/LfB1NLgJT5Y7dEBzaX4yAKqOPrcetaw==", + "node_modules/@expo/ws-tunnel": { + "version": "1.0.6", "license": "MIT", + "peer": true + }, + "node_modules/@expo/xcpretty": { + "version": "4.3.2", + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "ajv": "^6.12.6", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" + "@babel/code-frame": "7.10.4", + "chalk": "^4.1.0", + "find-up": "^5.0.0", + "js-yaml": "^4.1.0" }, - "engines": { - "node": ">=18" + "bin": { + "excpretty": "build/cli.js" } }, - "node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "node_modules/@expo/xcpretty/node_modules/@babel/code-frame": { + "version": "7.10.4", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@expo/xcpretty/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=8" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@noble/curves": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "node_modules/@expo/xcpretty/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0", + "peer": true + }, + "node_modules/@expo/xcpretty/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", + "peer": true, "dependencies": { - "@noble/hashes": "1.8.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@expo/xcpretty/node_modules/find-up": { + "version": "5.0.0", "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@expo/xcpretty/node_modules/js-yaml": { + "version": "4.1.0", "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@expo/xcpretty/node_modules/locate-path": { + "version": "6.0.0", "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@expo/xcpretty/node_modules/p-limit": { + "version": "3.1.0", "license": "MIT", + "peer": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", - "dev": true, + "node_modules/@expo/xcpretty/node_modules/p-locate": { + "version": "5.0.0", "license": "MIT", + "peer": true, "dependencies": { - "@noble/hashes": "^1.1.5" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@expo/xcpretty/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", - "optional": true, "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.0.tgz", - "integrity": "sha512-rZs8ziQ1YRV3Z5Mw5AR7YcgI3q1Ya9NIx6nyuZAT9wDSSjspSi+bww+Hargh/a4JfV2Ajcxpn9X9UiFJr1ddPw==", - "license": "MIT", - "peer": true, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 20.19.4" + "node": ">=18.18.0" } }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.5.tgz", - "integrity": "sha512-Rt/imdfqXihD/sn0xnV4flxxb1aLLjPtMF1QleQjEhJsTUPpH4TFlfOpoCvsrXoDl4OIcB1k4FVM24Ez92zf5w==", - "license": "MIT", - "peer": true, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@react-native/babel-preset": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.5.tgz", - "integrity": "sha512-GDUYIWslMLbdJHEgKNfrOzXk8EDKxKzbwmBXUugoiSlr6TyepVZsj3GZDLEFarOcTwH1EXXHJsixihk8DCRQDA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.79.5", - "babel-plugin-syntax-hermes-parser": "0.25.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18" }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@react-native/codegen": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.5.tgz", - "integrity": "sha512-FO5U1R525A1IFpJjy+KVznEinAgcs3u7IbnbRJUG9IH/MBXi2lEU2LtN+JarJ81MCfW4V2p0pg6t/3RGHFRrlQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.25.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12.22" }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@react-native/codegen/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "peer": true, - "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" - }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": "*" + "node": ">=18.18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@react-native/codegen/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@ioredis/commands": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.0.tgz", + "integrity": "sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", "license": "ISC", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "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" }, "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.0.tgz", - "integrity": "sha512-n04ACkCaLR54NmA/eWiDpjC16pHr7+yrbjQ6OEdRoXbm5EfL8FEre2kDAci7pfFdiSMpxdRULDlKpfQ+EV/GAQ==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", "license": "MIT", "peer": true, - "dependencies": { - "@react-native/dev-middleware": "0.81.0", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "metro": "^0.83.1", - "metro-config": "^0.83.1", - "metro-core": "^0.83.1", - "semver": "^7.1.3" - }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@react-native-community/cli": "*", - "@react-native/metro-config": "*" + "node": ">=12" }, - "peerDependenciesMeta": { - "@react-native-community/cli": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.0.tgz", - "integrity": "sha512-N/8uL2CGQfwiQRYFUNfmaYxRDSoSeOmFb56rb0PDnP3XbS5+X9ee7X4bdnukNHLGfkRdH7sVjlB8M5zE8XJOhw==", - "license": "BSD-3-Clause", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", "peer": true, "engines": { - "node": ">= 20.19.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.0.tgz", - "integrity": "sha512-J/HeC/+VgRyGECPPr9rAbe5S0OL6MCIrvrC/kgNKSME5+ZQLCiTpt3pdAoAMXwXiF9a02Nmido0DnyM1acXTIA==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT", + "peer": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", "license": "MIT", "peer": true, "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.0", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">= 20.19.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "license": "MIT", "peer": true, "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.5.tgz", - "integrity": "sha512-WQ49TRpCwhgUYo5/n+6GGykXmnumpOkl4Lr2l2o2buWU9qPOwoiBqJAtmWEXsAug4ciw3eLiVfthn5ufs0VB0A==", - "license": "BSD-3-Clause", - "peer": true, + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@react-native/dev-middleware": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.5.tgz", - "integrity": "sha512-U7r9M/SEktOCP/0uS6jXMHmYjj4ESfYCkNAenBjFjjsRWekiHE+U/vRMeO+fG9gq4UCcBAUISClkQCowlftYBw==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", "license": "MIT", "peer": true, "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.5", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "serve-static": "^1.16.2", - "ws": "^6.2.3" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "license": "ISC", "peer": true, "dependencies": { - "ms": "2.0.0" + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "license": "ISC", "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=12" } }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.0.tgz", - "integrity": "sha512-LGNtPXO1RKLws5ORRb4Q4YULi2qxM4qZRuARtwqM/1f2wyZVggqapoV0OXlaXaz+GiEd2ll3ROE4CcLN6J93jg==", - "license": "MIT", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "license": "ISC", "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">= 20.19.4" + "node": ">=8" } }, - "node_modules/@react-native/js-polyfills": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.0.tgz", - "integrity": "sha512-whXZWIogzoGpqdyTjqT89M6DXmlOkWqNpWoVOAwVi8XFCMO+L7WTk604okIgO6gdGZcP1YtFpQf9JusbKrv/XA==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "license": "MIT", "peer": true, "engines": { - "node": ">= 20.19.4" + "node": ">=8" } }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", - "integrity": "sha512-Mwovr4jJ3JTnbHEQLhdcMvS82LjijpqCydXl1aH2N16WVCrE5oSNFiqTt6NpZBw9zkJX7nijsY+xeCy6m+KK3Q==", + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", "license": "MIT", "peer": true, "dependencies": { - "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.81.0", - "hermes-parser": "0.29.1", - "nullthrows": "^1.1.1" + "@jest/types": "^29.6.3" }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-plugin-codegen": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.0.tgz", - "integrity": "sha512-MEMlW91+2Kk9GiObRP1Nc6oTdiyvmSEbPMSC6kzUzDyouxnh5/x28uyNySmB2nb6ivcbmQ0lxaU059+CZSkKXQ==", + "node_modules/@jest/environment": { + "version": "29.7.0", "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.0" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">= 20.19.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-preset": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.0.tgz", - "integrity": "sha512-RKMgCUGsso/2b32kgg24lB68LJ6qr2geLoSQTbisY6Usye0uXeXCgbZZDbILIX9upL4uzU4staMldRZ0v08F1g==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", "license": "MIT", "peer": true, "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.0", - "babel-plugin-syntax-hermes-parser": "0.29.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/codegen": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.0.tgz", - "integrity": "sha512-gPFutgtj8YqbwKKt3YpZKamUBGd9YZJV51Jq2aiDZ9oThkg1frUBa20E+Jdi7jKn982wjBMxAklAR85QGQ4xMA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", "license": "MIT", "peer": true, "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.29.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@babel/core": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "node_modules/@jest/transform": { + "version": "29.7.0", "license": "MIT", "peer": true, "dependencies": { - "hermes-parser": "0.29.1" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "peer": true, "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" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@react-native/metro-babel-transformer/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@react-native/metro-config": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.81.0.tgz", - "integrity": "sha512-5eqLP4TCERHGRYDJSZa//O98CGDFNNEwHVvhs65Msfy6hAoSdw5pAAuTrsQwmbTBp0Fkvu7Bx8BZDhiferZsHg==", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "@react-native/js-polyfills": "0.81.0", - "@react-native/metro-babel-transformer": "0.81.0", - "metro-config": "^0.83.1", - "metro-runtime": "^0.83.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 20.19.4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@react-native/normalize-colors": { - "version": "0.79.5", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.5.tgz", - "integrity": "sha512-nGXMNMclZgzLUxijQQ38Dm3IAEhgxuySAWQHnljFtfB0JdaMwpe0Ox9H7Tp2OgrEA+EMEv+Od9ElKlHwGKmmvQ==", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.0.tgz", - "integrity": "sha512-p14QC5INHkbMZ96158sUxkSwN6zp138W11G+CRGoLJY4Q9WRJBCe7wHR5Owyy3XczQXrIih/vxAXwgYeZ2XByg==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 20.19.4" - }, - "peerDependencies": { - "@types/react": "^19.1.0", - "react": "*", - "react-native": "*" + "node": ">=10" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.48.1.tgz", - "integrity": "sha512-rGmb8qoG/zdmKoYELCBwu7vt+9HxZ7Koos3pD0+sH5fR3u3Wb/jGcpnqxcnWsPEKDUyzeLSqksN8LJtgXjqBYw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.48.1.tgz", - "integrity": "sha512-4e9WtTxrk3gu1DFE+imNJr4WsL13nWbD/Y6wQcyku5qadlKHY3OQ3LJ/INrrjngv2BJIHnIzbqMk1GTAC2P8yQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.48.1.tgz", - "integrity": "sha512-+XjmyChHfc4TSs6WUQGmVf7Hkg8ferMAE2aNYYWjiLzAS/T62uOsdfnqv+GHRjq7rKRnYh4mwWb4Hz7h/alp8A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "peer": true, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.48.1.tgz", - "integrity": "sha512-upGEY7Ftw8M6BAJyGwnwMw91rSqXTcOKZnnveKrVWsMTF8/k5mleKSuh7D4v4IV1pLxKAk3Tbs0Lo9qYmii5mQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "peer": true, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.48.1.tgz", - "integrity": "sha512-P9ViWakdoynYFUOZhqq97vBrhuvRLAbN/p2tAVJvhLb8SvN7rbBnJQcBu8e/rQts42pXGLVhfsAP0k9KXWa3nQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.48.1.tgz", - "integrity": "sha512-VLKIwIpnBya5/saccM8JshpbxfyJt0Dsli0PjXozHwbSVaHTvWXJH1bbCwPXxnMzU4zVEfgD1HpW3VQHomi2AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.48.1.tgz", - "integrity": "sha512-3zEuZsXfKaw8n/yF7t8N6NNdhyFw3s8xJTqjbTDXlipwrEHo4GtIKcMJr5Ed29leLpB9AugtAQpAHW0jvtKKaQ==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.48.1.tgz", - "integrity": "sha512-leo9tOIlKrcBmmEypzunV/2w946JeLbTdDlwEZ7OnnsUyelZ72NMnT4B2vsikSgwQifjnJUbdXzuW4ToN1wV+Q==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.15.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.48.1.tgz", - "integrity": "sha512-Vy/WS4z4jEyvnJm+CnPfExIv5sSKqZrUr98h03hpAMbE2aI0aD2wvK6GiSe8Gx2wGp3eD81cYDpLLBqNb2ydwQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@noble/ciphers": { + "version": "1.3.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.48.1.tgz", - "integrity": "sha512-x5Kzn7XTwIssU9UYqWDB9VpLpfHYuXw5c6bJr4Mzv9kIv242vmJHbI5PJJEnmBYitUIfoMCODDhR7KoZLot2VQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@noble/curves": { + "version": "1.9.6", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.48.1.tgz", - "integrity": "sha512-yzCaBbwkkWt/EcgJOKDUdUpMHjhiZT/eDktOPWvSRpqrVE04p0Nd6EGV4/g7MARXXeOqstflqsKuXVM3H9wOIQ==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@noble/hashes": { + "version": "1.8.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.48.1.tgz", - "integrity": "sha512-UK0WzWUjMAJccHIeOpPhPcKBqax7QFg47hwZTp6kiMhQHeOYJeaMwzeRZe1q5IiTKsaLnHu9s6toSYVUlZ2QtQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.48.1.tgz", - "integrity": "sha512-3NADEIlt+aCdCbWVZ7D3tBjBX1lHpXxcvrLt/kdXTiBrOds8APTdtk2yRL2GgmnSVeX4YS1JIf0imFujg78vpw==", - "cpu": [ - "riscv64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">= 8" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.48.1.tgz", - "integrity": "sha512-euuwm/QTXAMOcyiFCcrx0/S2jGvFlKJ2Iro8rsmYL53dlblp3LkUQVFzEidHhvIPPvcIsxDhl2wkBE+I6YVGzA==", - "cpu": [ - "riscv64" - ], + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.48.1.tgz", - "integrity": "sha512-w8mULUjmPdWLJgmTYJx/W6Qhln1a+yqvgwmGXcQl2vFBkWsKGUBRbtLRuKJUln8Uaimf07zgJNxOhHOvjSQmBQ==", - "cpu": [ - "s390x" - ], + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@noble/hashes": "^1.1.5" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.48.1.tgz", - "integrity": "sha512-90taWXCWxTbClWuMZD0DKYohY1EovA+W5iytpE89oUPmT5O1HFdf8cuuVIylE6vCbrGdIGv85lVRzTcpTRZ+kA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@react-native/assets-registry": { + "version": "0.79.3", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.48.1.tgz", - "integrity": "sha512-2Gu29SkFh1FfTRuN1GR1afMuND2GKzlORQUP3mNMJbqdndOg7gNsa81JnORctazHRokiDzQ5+MLE5XYmZW5VWg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.79.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.79.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen/node_modules/@react-native/codegen": { + "version": "0.79.2", + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.1", + "hermes-parser": "0.25.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.79.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.79.2", + "babel-plugin-syntax-hermes-parser": "0.25.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.79.3", + "license": "MIT", + "peer": true, + "dependencies": { + "glob": "^7.1.1", + "hermes-parser": "0.25.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.79.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@react-native/dev-middleware": "0.79.3", + "chalk": "^4.0.0", + "debug": "^2.2.0", + "invariant": "^2.2.4", + "metro": "^0.82.0", + "metro-config": "^0.82.0", + "metro-core": "^0.82.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@react-native-community/cli": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli": { + "optional": true + } + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ms": { + "version": "2.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/@react-native/community-cli-plugin/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.79.3", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.79.3", + "license": "MIT", + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.79.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/@react-native/dev-middleware/node_modules/send": { + "version": "0.19.0", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT", + "peer": true + }, + "node_modules/@react-native/dev-middleware/node_modules/serve-static": { + "version": "1.16.2", + "license": "MIT", + "peer": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", + "license": "MIT", + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.79.3", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.79.3", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.48.1.tgz", - "integrity": "sha512-6kQFR1WuAO50bxkIlAVeIYsz3RUx+xymwhTo9j94dJ+kmHe9ly7muH23sdfWduD0BA8pD9/yhonUvAjxGh34jQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@react-native/normalize-colors": { + "version": "0.79.3", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.48.1.tgz", - "integrity": "sha512-RUyZZ/mga88lMI3RlXFs4WQ7n3VyU07sPXmMG7/C1NOi8qisUg57Y7LRarqoGoAiopmGmChUhSwfpvQ3H5iGSQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@react-native/virtualized-lists": { + "version": "0.79.3", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true, + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^19.0.0", + "react": "*", + "react-native": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.48.1.tgz", - "integrity": "sha512-8a/caCUN4vkTChxkaIJcMtwIVcBhi4X2PQRoT+yCK3qRYaZ7cURrmJFL5Ux9H9RaMIXj9RuihckdmkBX3zZsgg==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.2", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, "node_modules/@rtsao/scc": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, "node_modules/@scure/base": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", - "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" @@ -4529,8 +4090,6 @@ }, "node_modules/@scure/bip32": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", - "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", "license": "MIT", "dependencies": { "@noble/curves": "~1.9.0", @@ -4543,8 +4102,6 @@ }, "node_modules/@scure/bip39": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", - "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", "license": "MIT", "dependencies": { "@noble/hashes": "~1.8.0", @@ -4556,15 +4113,11 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "license": "MIT", "peer": true }, "node_modules/@sinonjs/commons": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -4573,8 +4126,6 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -4583,8 +4134,6 @@ }, "node_modules/@solana/buffer-layout": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", - "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "license": "MIT", "dependencies": { "buffer": "~6.0.3" @@ -4595,8 +4144,6 @@ }, "node_modules/@solana/buffer-layout-utils": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", - "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", "license": "Apache-2.0", "dependencies": { "@solana/buffer-layout": "^4.0.0", @@ -4610,8 +4157,6 @@ }, "node_modules/@solana/codecs": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", - "integrity": "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==", "license": "MIT", "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", @@ -4626,8 +4171,6 @@ }, "node_modules/@solana/codecs-core": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", - "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", "license": "MIT", "dependencies": { "@solana/errors": "2.0.0-rc.1" @@ -4638,8 +4181,6 @@ }, "node_modules/@solana/codecs-data-structures": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz", - "integrity": "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==", "license": "MIT", "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", @@ -4652,8 +4193,6 @@ }, "node_modules/@solana/codecs-numbers": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", - "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", "license": "MIT", "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", @@ -4665,8 +4204,6 @@ }, "node_modules/@solana/codecs-strings": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", - "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", "license": "MIT", "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", @@ -4680,8 +4217,6 @@ }, "node_modules/@solana/errors": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", - "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", "license": "MIT", "dependencies": { "chalk": "^5.3.0", @@ -4694,22 +4229,8 @@ "typescript": ">=5" } }, - "node_modules/@solana/errors/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@solana/options": { "version": "2.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", - "integrity": "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==", "license": "MIT", "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", @@ -4724,8 +4245,6 @@ }, "node_modules/@solana/pay": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@solana/pay/-/pay-0.2.6.tgz", - "integrity": "sha512-6vZxVKvMvE5E3yyw0+WD3zIH47Gz3kuvqU2KqHxKUgmPRMH32gW26Dq77XmGdY3FOuWW8ZGvb9j8YiO86MC2eA==", "license": "Apache-2.0", "dependencies": { "@solana/qr-code-styling": "^1.6.0", @@ -4742,8 +4261,6 @@ }, "node_modules/@solana/qr-code-styling": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@solana/qr-code-styling/-/qr-code-styling-1.6.0.tgz", - "integrity": "sha512-KyBmyFKPxQPhUkP0jjnxV2ZeF1R1guTD8Hrd0YvHvMnhtrNEoEEdv4Jpp4W0GN4qCGG2KYOM5d3TgoLD+CNf9Q==", "license": "MIT", "dependencies": { "qrcode-generator": "^1.4.3" @@ -4751,8 +4268,6 @@ }, "node_modules/@solana/spl-token": { "version": "0.4.13", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.13.tgz", - "integrity": "sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w==", "license": "Apache-2.0", "dependencies": { "@solana/buffer-layout": "^4.0.0", @@ -4770,8 +4285,6 @@ }, "node_modules/@solana/spl-token-group": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.7.tgz", - "integrity": "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==", "license": "Apache-2.0", "dependencies": { "@solana/codecs": "2.0.0-rc.1" @@ -4785,8 +4298,6 @@ }, "node_modules/@solana/spl-token-metadata": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.6.tgz", - "integrity": "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==", "license": "Apache-2.0", "dependencies": { "@solana/codecs": "2.0.0-rc.1" @@ -4799,9 +4310,7 @@ } }, "node_modules/@solana/web3.js": { - "version": "1.98.4", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.4.tgz", - "integrity": "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==", + "version": "1.98.2", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", @@ -4822,44 +4331,38 @@ } }, "node_modules/@solana/web3.js/node_modules/@solana/codecs-core": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.3.0.tgz", - "integrity": "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==", + "version": "2.1.0", "license": "MIT", "dependencies": { - "@solana/errors": "2.3.0" + "@solana/errors": "2.1.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5" } }, "node_modules/@solana/web3.js/node_modules/@solana/codecs-numbers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.3.0.tgz", - "integrity": "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==", + "version": "2.1.0", "license": "MIT", "dependencies": { - "@solana/codecs-core": "2.3.0", - "@solana/errors": "2.3.0" + "@solana/codecs-core": "2.1.0", + "@solana/errors": "2.1.0" }, "engines": { "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5" } }, "node_modules/@solana/web3.js/node_modules/@solana/errors": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.3.0.tgz", - "integrity": "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==", + "version": "2.1.0", "license": "MIT", "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0" + "chalk": "^5.3.0", + "commander": "^13.1.0" }, "bin": { "errors": "bin/cli.mjs" @@ -4868,34 +4371,32 @@ "node": ">=20.18.0" }, "peerDependencies": { - "typescript": ">=5.3.3" + "typescript": ">=5" } }, - "node_modules/@solana/web3.js/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", + "node_modules/@solana/web3.js/node_modules/base-x": { + "version": "3.0.11", "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/@solana/web3.js/node_modules/bs58": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" } }, "node_modules/@solana/web3.js/node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "13.1.0", "license": "MIT", "engines": { - "node": ">=20" + "node": ">=18" } }, "node_modules/@swc/helpers": { "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -4903,8 +4404,6 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "license": "MIT", "peer": true, "dependencies": { @@ -4917,8 +4416,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "license": "MIT", "peer": true, "dependencies": { @@ -4927,8 +4424,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "license": "MIT", "peer": true, "dependencies": { @@ -4937,19 +4432,15 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "version": "7.20.7", "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.20.7" } }, "node_modules/@types/better-sqlite3": { "version": "7.6.13", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", "dev": true, "license": "MIT", "dependencies": { @@ -4957,29 +4448,15 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "version": "1.19.5", "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -4987,36 +4464,21 @@ }, "node_modules/@types/content-type": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@types/content-type/-/content-type-1.1.9.tgz", - "integrity": "sha512-Hq9IMnfekuOCsEmYl4QX2HBrT+XsfXiupfrLLY8Dcf3Puf4BkBOxSbWYTITSOQAhJoYPBez+b4MJRpIYL65z8A==", "dev": true, "license": "MIT" }, "node_modules/@types/cookiejar": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.7", "dev": true, "license": "MIT" }, "node_modules/@types/express": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", - "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "version": "5.0.1", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -5025,9 +4487,7 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", - "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", + "version": "5.0.6", "license": "MIT", "dependencies": { "@types/node": "*", @@ -5038,15 +4498,11 @@ }, "node_modules/@types/glob-to-regexp": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.4.tgz", - "integrity": "sha512-nDKoaKJYbnn1MZxUY0cA1bPmmgZbg0cTq7Rh13d0KWYNOiKbqoR+2d89SnRPszGh7ROzSwZ/GOjZ4jPbmmZ6Eg==", "dev": true, "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "license": "MIT", "peer": true, "dependencies": { @@ -5054,22 +4510,16 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "version": "2.0.4", "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "license": "MIT", "peer": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "license": "MIT", "peer": true, "dependencies": { @@ -5078,8 +4528,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", "peer": true, "dependencies": { @@ -5088,56 +4536,40 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@types/methods": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", "dev": true, "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/node": { - "version": "22.18.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz", - "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==", + "version": "22.15.14", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "version": "6.9.18", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "0.17.4", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -5145,9 +4577,7 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.7", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -5157,15 +4587,11 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "license": "MIT", "peer": true }, "node_modules/@types/superagent": { "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5177,8 +4603,6 @@ }, "node_modules/@types/supertest": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", "dev": true, "license": "MIT", "dependencies": { @@ -5188,14 +4612,10 @@ }, "node_modules/@types/uuid": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "license": "MIT" }, "node_modules/@types/ws": { "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -5203,8 +4623,6 @@ }, "node_modules/@types/yargs": { "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "peer": true, "dependencies": { @@ -5213,23 +4631,19 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT", "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", - "integrity": "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/type-utils": "8.41.0", - "@typescript-eslint/utils": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5243,22 +4657,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.41.0", + "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", - "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4" }, "engines": { @@ -5270,18 +4682,16 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", "debug": "^4.3.4" }, "engines": { @@ -5292,18 +4702,16 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5314,9 +4722,7 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "version": "8.38.0", "dev": true, "license": "MIT", "engines": { @@ -5327,19 +4733,17 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", - "integrity": "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -5352,13 +4756,11 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.38.0", "dev": true, "license": "MIT", "engines": { @@ -5370,16 +4772,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5395,20 +4795,40 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", - "integrity": "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0" + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5419,17 +4839,15 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "version": "8.38.0", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/types": "8.38.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -5442,8 +4860,6 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5454,24 +4870,20 @@ } }, "node_modules/@urql/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", - "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", + "version": "5.1.1", "license": "MIT", "peer": true, "dependencies": { - "@0no-co/graphql.web": "^1.0.13", + "@0no-co/graphql.web": "^1.0.5", "wonka": "^6.3.2" } }, "node_modules/@urql/exchange-retry": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", - "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", + "version": "1.3.1", "license": "MIT", "peer": true, "dependencies": { - "@urql/core": "^5.1.2", + "@urql/core": "^5.1.1", "wonka": "^6.3.2" }, "peerDependencies": { @@ -5479,15 +4891,12 @@ } }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -5496,13 +4905,11 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "3.1.3", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -5511,7 +4918,7 @@ }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { "msw": { @@ -5523,9 +4930,7 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { @@ -5536,28 +4941,23 @@ } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "3.1.3", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", + "@vitest/pretty-format": "3.1.3", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -5566,27 +4966,23 @@ } }, "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", + "@vitest/pretty-format": "3.1.3", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, "funding": { @@ -5594,9 +4990,7 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "version": "0.8.10", "license": "MIT", "peer": true, "engines": { @@ -5605,8 +4999,6 @@ }, "node_modules/abitype": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", - "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/wevm" @@ -5626,8 +5018,6 @@ }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "peer": true, "dependencies": { @@ -5638,22 +5028,25 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5664,8 +5057,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5673,9 +5064,7 @@ } }, "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "version": "7.1.3", "license": "MIT", "engines": { "node": ">= 14" @@ -5683,8 +5072,6 @@ }, "node_modules/agentkeepalive": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" @@ -5695,8 +5082,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -5711,15 +5096,11 @@ }, "node_modules/anser": { "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "license": "MIT", "peer": true }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "peer": true, "dependencies": { @@ -5734,8 +5115,6 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { @@ -5747,8 +5126,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "peer": true, "engines": { @@ -5756,15 +5133,11 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "5.2.0", "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "peer": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -5772,15 +5145,11 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "license": "MIT", "peer": true }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", "peer": true, "dependencies": { @@ -5791,23 +5160,32 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT", "peer": true }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" + "version": "1.0.10", + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -5823,8 +5201,6 @@ }, "node_modules/array-includes": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5846,8 +5222,6 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5868,8 +5242,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { @@ -5887,8 +5259,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { @@ -5906,8 +5276,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5928,14 +5296,10 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -5944,8 +5308,6 @@ }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -5954,22 +5316,16 @@ }, "node_modules/async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "license": "MIT", "peer": true }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5982,10 +5338,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", + "license": "MIT", + "peer": true + }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "license": "MIT", "peer": true, "dependencies": { @@ -6004,10 +5365,48 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -6023,8 +5422,6 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", "peer": true, "dependencies": { @@ -6038,14 +5435,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "version": "0.4.13", "license": "MIT", "peer": true, "dependencies": { - "@babel/compat-data": "^7.27.7", - "@babel/helper-define-polyfill-provider": "^0.6.5", + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -6054,8 +5449,6 @@ }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -6063,27 +5456,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "version": "0.11.1", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5", - "core-js-compat": "^3.43.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "version": "0.6.4", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.5" + "@babel/helper-define-polyfill-provider": "^0.6.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -6091,15 +5480,11 @@ }, "node_modules/babel-plugin-react-native-web": { "version": "0.19.13", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz", - "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==", "license": "MIT", "peer": true }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz", - "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6108,8 +5493,6 @@ }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6117,9 +5500,7 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "version": "1.1.0", "license": "MIT", "peer": true, "dependencies": { @@ -6140,13 +5521,11 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-expo": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.3.tgz", - "integrity": "sha512-wQJn92lqj8GKR7Ojg/aW4+GkqI6ZdDNTDyOqhhl7A9bAqk6t0ukUOWLDXQb4p0qKJjMDV1F6gNWasI2KUbuVTQ==", + "version": "13.1.11", "license": "MIT", "peer": true, "dependencies": { @@ -6164,7 +5543,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.79.5", + "@react-native/babel-preset": "0.79.2", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", @@ -6181,20 +5560,8 @@ } } }, - "node_modules/babel-preset-expo/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "license": "MIT", "peer": true, "dependencies": { @@ -6210,23 +5577,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "version": "5.0.1", + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -6245,8 +5603,6 @@ }, "node_modules/better-opn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6258,8 +5614,6 @@ }, "node_modules/better-opn/node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6274,10 +5628,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/better-sqlite3": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.2.0.tgz", + "integrity": "sha512-eGbYq2CT+tos1fBwLQ/tkBt9J5M3JEHjku4hbvQUePCckkvVf14xWj+1m7dGoK81M/fOjFT7yM9UMeKT/+vFLQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x" + } + }, "node_modules/big-integer": { "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "license": "Unlicense", "peer": true, "engines": { @@ -6286,8 +5652,6 @@ }, "node_modules/bigint-buffer": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", - "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -6298,9 +5662,7 @@ } }, "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "version": "9.3.0", "license": "MIT", "engines": { "node": "*" @@ -6308,23 +5670,52 @@ }, "node_modules/bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { - "file-uri-to-path": "1.0.0" + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/bn.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "license": "MIT" }, "node_modules/body-parser": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -6341,65 +5732,31 @@ "node": ">=18" } }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", + "node_modules/borsh": { + "version": "0.7.0", + "license": "Apache-2.0", "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" } }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/borsh/node_modules/base-x": { + "version": "3.0.11", "license": "MIT", "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" + "safe-buffer": "^5.0.1" } }, - "node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", - "license": "Apache-2.0", + "node_modules/borsh/node_modules/bs58": { + "version": "4.0.1", + "license": "MIT", "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" + "base-x": "^3.0.2" } }, "node_modules/bplist-creator": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", - "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "license": "MIT", "peer": true, "dependencies": { @@ -6408,8 +5765,6 @@ }, "node_modules/bplist-parser": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6420,18 +5775,15 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "1.1.12", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -6441,9 +5793,7 @@ } }, "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", + "version": "4.25.0", "funding": [ { "type": "opencollective", @@ -6461,8 +5811,8 @@ "license": "MIT", "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -6474,18 +5824,14 @@ } }, "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "version": "6.0.0", "license": "MIT", "dependencies": { - "base-x": "^3.0.2" + "base-x": "^5.0.0" } }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -6494,8 +5840,6 @@ }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -6518,15 +5862,11 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT", "peer": true }, "node_modules/bufferutil": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", - "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -6539,8 +5879,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -6548,8 +5886,6 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -6558,8 +5894,6 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { @@ -6577,8 +5911,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6590,8 +5922,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -6606,8 +5936,6 @@ }, "node_modules/caller-callsite": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "license": "MIT", "peer": true, "dependencies": { @@ -6617,20 +5945,8 @@ "node": ">=4" } }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/caller-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "license": "MIT", "peer": true, "dependencies": { @@ -6641,19 +5957,15 @@ } }, "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "version": "2.0.0", "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", "peer": true, "engines": { @@ -6661,9 +5973,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001737", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", - "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "version": "1.0.30001721", "funding": [ { "type": "opencollective", @@ -6682,9 +5992,7 @@ "peer": true }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -6695,20 +6003,14 @@ "pathval": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.4.1", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -6716,8 +6018,6 @@ }, "node_modules/check-error": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, "license": "MIT", "engines": { @@ -6726,8 +6026,6 @@ }, "node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "license": "BlueOak-1.0.0", "peer": true, "engines": { @@ -6736,8 +6034,6 @@ }, "node_modules/chrome-launcher": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -6755,8 +6051,6 @@ }, "node_modules/chromium-edge-launcher": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -6770,8 +6064,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "funding": [ { "type": "github", @@ -6786,8 +6078,6 @@ }, "node_modules/cli-cursor": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "peer": true, "dependencies": { @@ -6799,8 +6089,6 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", "peer": true, "engines": { @@ -6812,8 +6100,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "peer": true, "dependencies": { @@ -6825,45 +6111,8 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "peer": true, "engines": { @@ -6872,17 +6121,22 @@ }, "node_modules/clsx": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -6893,14 +6147,10 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { @@ -6912,8 +6162,6 @@ }, "node_modules/commander": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "engines": { "node": ">=18" @@ -6921,8 +6169,6 @@ }, "node_modules/component-emitter": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, "license": "MIT", "funding": { @@ -6931,8 +6177,6 @@ }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "peer": true, "dependencies": { @@ -6944,8 +6188,6 @@ }, "node_modules/compression": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "peer": true, "dependencies": { @@ -6963,8 +6205,6 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "peer": true, "dependencies": { @@ -6973,15 +6213,11 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT", "peer": true }, "node_modules/compression/node_modules/negotiator": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "peer": true, "engines": { @@ -6990,14 +6226,10 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/connect": { "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "license": "MIT", "peer": true, "dependencies": { @@ -7012,26 +6244,63 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "peer": true, "dependencies": { "ms": "2.0.0" } }, + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT", "peer": true }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, + "version": "1.0.0", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -7042,8 +6311,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7051,15 +6318,11 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT", "peer": true }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7067,8 +6330,6 @@ }, "node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -7076,19 +6337,15 @@ }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true, "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.42.0", "license": "MIT", "peer": true, "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -7097,8 +6354,6 @@ }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -7110,8 +6365,6 @@ }, "node_modules/cosmiconfig": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "license": "MIT", "peer": true, "dependencies": { @@ -7124,58 +6377,8 @@ "node": ">=4" } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "license": "MIT", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/cross-fetch": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", - "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" @@ -7183,8 +6386,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -7197,8 +6398,6 @@ }, "node_modules/crypto-random-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "license": "MIT", "peer": true, "engines": { @@ -7207,8 +6406,6 @@ }, "node_modules/cssstyle": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, "license": "MIT", "dependencies": { @@ -7221,15 +6418,11 @@ }, "node_modules/cssstyle/node_modules/rrweb-cssom": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true, "license": "MIT" }, "node_modules/data-urls": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { @@ -7240,12 +6433,8 @@ "node": ">=18" } }, -<<<<<<< HEAD -======= "node_modules/data-urls/node_modules/tr46": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -7257,31 +6446,22 @@ }, "node_modules/data-urls/node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, ->>>>>>> c8ea810 (flesh out) "node_modules/data-urls/node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, -<<<<<<< HEAD -======= "node_modules/data-urls/node_modules/whatwg-url": { "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { @@ -7292,11 +6472,8 @@ "node": ">=18" } }, ->>>>>>> c8ea810 (flesh out) "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7313,8 +6490,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7331,8 +6506,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7348,9 +6521,7 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.0", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -7365,16 +6536,27 @@ } }, "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "version": "10.5.0", "dev": true, "license": "MIT" }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", "engines": { @@ -7383,25 +6565,18 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", - "peer": true, "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "license": "MIT", "peer": true, "engines": { @@ -7410,8 +6585,6 @@ }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "peer": true, "dependencies": { @@ -7423,8 +6596,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -7441,8 +6612,6 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "license": "MIT", "peer": true, "engines": { @@ -7451,8 +6620,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -7469,8 +6636,6 @@ }, "node_modules/delay": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", "license": "MIT", "engines": { "node": ">=10" @@ -7481,28 +6646,30 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { @@ -7511,8 +6678,6 @@ }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "peer": true, "engines": { @@ -7520,26 +6685,17 @@ "npm": "1.2.8000 || >= 1.4.16" } }, -<<<<<<< HEAD "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "license": "Apache-2.0", - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, -======= ->>>>>>> a1d033e (npm install) "node_modules/dezalgo": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "license": "ISC", "dependencies": { @@ -7549,8 +6705,6 @@ }, "node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7561,9 +6715,7 @@ } }, "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "version": "16.5.0", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -7574,8 +6726,6 @@ }, "node_modules/dotenv-expand": { "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -7590,8 +6740,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -7604,44 +6752,41 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT", "peer": true }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.209", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.209.tgz", - "integrity": "sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==", + "version": "1.5.165", "license": "ISC", "peer": true }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", "license": "MIT", "peer": true }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "version": "6.0.1", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7653,8 +6798,6 @@ }, "node_modules/env-editor": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", "license": "MIT", "peer": true, "engines": { @@ -7663,8 +6806,6 @@ }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "license": "MIT", "peer": true, "dependencies": { @@ -7673,8 +6814,6 @@ }, "node_modules/error-stack-parser": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "license": "MIT", "peer": true, "dependencies": { @@ -7683,8 +6822,6 @@ }, "node_modules/es-abstract": { "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { @@ -7752,8 +6889,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7761,8 +6896,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7770,15 +6903,11 @@ }, "node_modules/es-module-lexer": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -7789,8 +6918,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -7805,8 +6932,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -7818,8 +6943,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -7836,23 +6959,17 @@ }, "node_modules/es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "license": "MIT" }, "node_modules/es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "license": "MIT", "dependencies": { "es6-promise": "^4.0.3" } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.4", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7863,38 +6980,35 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "peer": true, "engines": { @@ -7903,14 +7017,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -7920,20 +7030,18 @@ } }, "node_modules/eslint": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "version": "9.32.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.34.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.32.0", + "@eslint/plugin-kit": "^0.3.4", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -7982,8 +7090,6 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { @@ -7994,8 +7100,6 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8004,8 +7108,6 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -8022,8 +7124,6 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8032,8 +7132,6 @@ }, "node_modules/eslint-plugin-import": { "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { @@ -8058,60 +7156,70 @@ "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", "dev": true, "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-scope": { + "node_modules/eslint/node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8125,70 +7233,95 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "p-locate": "^5.0.0" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8205,8 +7338,6 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -8218,8 +7349,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "peer": true, "bin": { @@ -8232,8 +7361,6 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8245,8 +7372,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8258,8 +7383,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -8268,8 +7391,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -8278,8 +7399,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -8288,8 +7407,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8297,8 +7414,6 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "peer": true, "engines": { @@ -8307,14 +7422,10 @@ }, "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/eventsource": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -8324,25 +7435,28 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.5.tgz", - "integrity": "sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==", + "version": "3.0.2", "license": "MIT", "engines": { - "node": ">=20.0.0" + "node": ">=18.0.0" } }, "node_modules/exec-async": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", - "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", "license": "MIT", "peer": true }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "version": "1.2.1", "dev": true, "license": "Apache-2.0", "engines": { @@ -8350,27 +7464,25 @@ } }, "node_modules/expo": { - "version": "53.0.20", - "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.20.tgz", - "integrity": "sha512-Nh+HIywVy9KxT/LtH08QcXqrxtUOA9BZhsXn3KCsAYA+kNb80M8VKN8/jfQF+I6CgeKyFKJoPNsWgI0y0VBGrA==", + "version": "53.0.9", "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.24.20", - "@expo/config": "~11.0.13", - "@expo/config-plugins": "~10.1.2", - "@expo/fingerprint": "0.13.4", - "@expo/metro-config": "0.20.17", + "@expo/cli": "0.24.13", + "@expo/config": "~11.0.10", + "@expo/config-plugins": "~10.0.2", + "@expo/fingerprint": "0.12.4", + "@expo/metro-config": "0.20.14", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~13.2.3", - "expo-asset": "~11.1.7", - "expo-constants": "~17.1.7", - "expo-file-system": "~18.1.11", - "expo-font": "~13.3.2", + "babel-preset-expo": "~13.1.11", + "expo-asset": "~11.1.5", + "expo-constants": "~17.1.6", + "expo-file-system": "~18.1.10", + "expo-font": "~13.3.1", "expo-keep-awake": "~14.1.4", - "expo-modules-autolinking": "2.1.14", - "expo-modules-core": "2.5.0", + "expo-modules-autolinking": "2.1.10", + "expo-modules-core": "2.3.13", "react-native-edge-to-edge": "1.6.0", "whatwg-url-without-unicode": "8.0.0-3" }, @@ -8399,14 +7511,12 @@ } }, "node_modules/expo-asset": { - "version": "11.1.7", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.1.7.tgz", - "integrity": "sha512-b5P8GpjUh08fRCf6m5XPVAh7ra42cQrHBIMgH2UXP+xsj4Wufl6pLy6jRF5w6U7DranUMbsXm8TOyq4EHy7ADg==", + "version": "11.1.5", "license": "MIT", "peer": true, "dependencies": { - "@expo/image-utils": "^0.7.6", - "expo-constants": "~17.1.7" + "@expo/image-utils": "^0.7.4", + "expo-constants": "~17.1.5" }, "peerDependencies": { "expo": "*", @@ -8415,129 +7525,252 @@ } }, "node_modules/expo-constants": { - "version": "17.1.7", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.1.7.tgz", - "integrity": "sha512-byBjGsJ6T6FrLlhOBxw4EaiMXrZEn/MlUYIj/JAd+FS7ll5X/S4qVRbIimSJtdW47hXMq0zxPfJX6njtA56hHA==", + "version": "17.1.6", "license": "MIT", "peer": true, "dependencies": { - "@expo/config": "~11.0.12", - "@expo/env": "~1.0.7" + "@expo/config": "~11.0.9", + "@expo/env": "~1.0.5" }, "peerDependencies": { "expo": "*", "react-native": "*" } }, - "node_modules/expo-crypto": { - "version": "14.1.5", - "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-14.1.5.tgz", - "integrity": "sha512-ZXJoUMoUeiMNEoSD4itItFFz3cKrit6YJ/BR0hjuwNC+NczbV9rorvhvmeJmrU9O2cFQHhJQQR1fjQnt45Vu4Q==", + "node_modules/expo-crypto": { + "version": "14.1.4", + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-file-system": { + "version": "18.1.10", + "license": "MIT", + "peer": true, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo-font": { + "version": "13.3.1", + "license": "MIT", + "peer": true, + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-keep-awake": { + "version": "14.1.4", + "license": "MIT", + "peer": true, + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "2.1.10", + "license": "MIT", + "peer": true, + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "find-up": "^5.0.0", + "glob": "^10.4.2", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-autolinking/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo-modules-autolinking/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/expo-modules-autolinking/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expo-modules-autolinking/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/expo-modules-autolinking/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/expo-modules-autolinking/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo-modules-autolinking/node_modules/locate-path": { + "version": "6.0.0", "license": "MIT", "peer": true, "dependencies": { - "base64-js": "^1.3.0" + "p-locate": "^5.0.0" }, - "peerDependencies": { - "expo": "*" - } - }, - "node_modules/expo-file-system": { - "version": "18.1.11", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.1.11.tgz", - "integrity": "sha512-HJw/m0nVOKeqeRjPjGdvm+zBi5/NxcdPf8M8P3G2JFvH5Z8vBWqVDic2O58jnT1OFEy0XXzoH9UqFu7cHg9DTQ==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "expo": "*", - "react-native": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expo-font": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.3.2.tgz", - "integrity": "sha512-wUlMdpqURmQ/CNKK/+BIHkDA5nGjMqNlYmW0pJFXY/KE/OG80Qcavdu2sHsL4efAIiNGvYdBS10WztuQYU4X0A==", - "license": "MIT", + "node_modules/expo-modules-autolinking/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", "peer": true, "dependencies": { - "fontfaceobserver": "^2.1.0" + "brace-expansion": "^2.0.1" }, - "peerDependencies": { - "expo": "*", - "react": "*" + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/expo-keep-awake": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.1.4.tgz", - "integrity": "sha512-wU9qOnosy4+U4z/o4h8W9PjPvcFMfZXrlUoKTMBW7F4pLqhkkP/5G4EviPZixv4XWFMjn1ExQ5rV6BX8GwJsWA==", + "node_modules/expo-modules-autolinking/node_modules/p-limit": { + "version": "3.1.0", "license": "MIT", "peer": true, - "peerDependencies": { - "expo": "*", - "react": "*" + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expo-modules-autolinking": { - "version": "2.1.14", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.14.tgz", - "integrity": "sha512-nT5ERXwc+0ZT/pozDoJjYZyUQu5RnXMk9jDGm5lg+PiKvsrCTSA/2/eftJGMxLkTjVI2MXp5WjSz3JRjbA7UXA==", + "node_modules/expo-modules-autolinking/node_modules/p-locate": { + "version": "5.0.0", "license": "MIT", "peer": true, "dependencies": { - "@expo/spawn-async": "^1.7.2", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "find-up": "^5.0.0", - "glob": "^10.4.2", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" + "p-limit": "^3.0.2" }, - "bin": { - "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expo-modules-autolinking/node_modules/commander": { + "node_modules/expo-modules-autolinking/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/expo-modules-autolinking/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/expo-modules-core": { + "version": "2.3.13", "license": "MIT", "peer": true, - "engines": { - "node": ">=8" + "dependencies": { + "invariant": "^2.2.4" } }, - "node_modules/expo-modules-core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.5.0.tgz", - "integrity": "sha512-aIbQxZE2vdCKsolQUl6Q9Farlf8tjh/ROR4hfN1qT7QBGPl1XrJGnaOKkcgYaGrlzCPg/7IBe0Np67GzKMZKKQ==", + "node_modules/expo-sqlite": { + "version": "15.2.14", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-15.2.14.tgz", + "integrity": "sha512-6tWnEE0fcir30/e7eVwjeC7eKdncfVnIgo2JvnKpRndedyiFMXLMyOQWNVGnuhnSrPV2BHvGGjLByS/j5VgH4w==", "license": "MIT", "peer": true, "dependencies": { - "invariant": "^2.2.4" + "await-lock": "^2.2.2" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" } }, "node_modules/exponential-backoff": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "license": "Apache-2.0", "peer": true }, "node_modules/express": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -8577,9 +7810,7 @@ } }, "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "version": "7.5.0", "license": "MIT", "engines": { "node": ">= 16" @@ -8588,180 +7819,21 @@ "url": "https://github.com/sponsors/express-rate-limit" }, "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/express/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/express/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/express/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" + "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "node_modules/eyes": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", "engines": { "node": "> 0.1.90" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -8777,8 +7849,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -8790,41 +7860,29 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true, "license": "MIT" }, "node_modules/fast-stable-stringify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", - "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", "license": "MIT" }, "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", - "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", - "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", "license": "CC0-1.0", "peer": true }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -8833,18 +7891,27 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "license": "Apache-2.0", "peer": true, "dependencies": { "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.4.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fetch-mock": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-12.5.3.tgz", - "integrity": "sha512-SiqPv1IXvDjNjLWCvfFUltba3VeiYucxjyynoVW8Ft07GLFQRitlzjYZI/f5wZpeQFRIVZ84fmMgJfjwb/dAEA==", + "version": "12.5.2", "dev": true, "license": "MIT", "dependencies": { @@ -8859,8 +7926,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8872,111 +7937,47 @@ }, "node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "license": "MIT" }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { - "ee-first": "1.1.1" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/finalhandler": { + "version": "2.1.0", "license": "MIT", - "peer": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "version": "4.1.0", "license": "MIT", + "peer": true, "dependencies": { - "locate-path": "^6.0.0", + "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -8989,29 +7990,21 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/flow-enums-runtime": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", "license": "MIT", "peer": true }, "node_modules/fontfaceobserver": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", - "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "license": "BSD-2-Clause", "peer": true }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -9026,8 +8019,6 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", "peer": true, "dependencies": { @@ -9041,10 +8032,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -9058,10 +8058,27 @@ "node": ">= 6" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/formidable": { "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, "license": "MIT", "dependencies": { @@ -9078,8 +8095,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9087,8 +8102,6 @@ }, "node_modules/freeport-async": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", "license": "MIT", "peer": true, "engines": { @@ -9096,26 +8109,25 @@ } }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC", "peer": true }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -9127,8 +8139,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9136,8 +8146,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9157,8 +8165,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -9167,8 +8173,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "license": "MIT", "peer": true, "engines": { @@ -9177,8 +8181,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "peer": true, "engines": { @@ -9187,8 +8189,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -9211,8 +8211,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "license": "MIT", "peer": true, "engines": { @@ -9221,8 +8219,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -9234,8 +8230,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -9251,9 +8245,7 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.10.0", "dev": true, "license": "MIT", "dependencies": { @@ -9264,31 +8256,33 @@ } }, "node_modules/getenv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", - "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", + "version": "1.0.0", "license": "MIT", "peer": true, "engines": { "node": ">=6" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "7.2.3", "license": "ISC", "peer": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "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" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9296,8 +8290,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -9309,28 +8301,19 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, + "version": "11.12.0", "license": "MIT", + "peer": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9346,8 +8329,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9358,22 +8339,16 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC", "peer": true }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/happy-dom": { "version": "15.11.7", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-15.11.7.tgz", - "integrity": "sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==", "dev": true, "license": "MIT", "dependencies": { @@ -9385,10 +8360,27 @@ "node": ">=18.0.0" } }, + "node_modules/happy-dom/node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/happy-dom/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -9400,8 +8392,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -9409,8 +8399,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -9422,8 +8410,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9438,8 +8424,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9450,8 +8434,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -9466,8 +8448,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -9478,15 +8458,11 @@ }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "license": "MIT", "peer": true }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "license": "MIT", "peer": true, "dependencies": { @@ -9495,8 +8471,6 @@ }, "node_modules/hosted-git-info": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "license": "ISC", "peer": true, "dependencies": { @@ -9508,15 +8482,11 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC", "peer": true }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9528,8 +8498,6 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -9542,31 +8510,8 @@ "node": ">= 0.8" } }, -<<<<<<< HEAD - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, -======= ->>>>>>> c8ea810 (flesh out) "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -9579,8 +8524,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -9592,8 +8535,6 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", "dependencies": { "ms": "^2.0.0" @@ -9601,8 +8542,6 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -9613,14 +8552,10 @@ }, "node_modules/idb-keyval": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", "license": "Apache-2.0" }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -9639,8 +8574,6 @@ }, "node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -9649,8 +8582,6 @@ }, "node_modules/image-size": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", "peer": true, "dependencies": { @@ -9664,26 +8595,27 @@ } }, "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, + "version": "2.0.0", "license": "MIT", + "peer": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "3.0.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -9691,9 +8623,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "peer": true, "dependencies": { @@ -9703,21 +8632,14 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -9731,18 +8653,38 @@ }, "node_modules/invariant": { "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.0.0" } }, + "node_modules/ioredis": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.7.0.tgz", + "integrity": "sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "^1.3.0", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -9750,8 +8692,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -9768,15 +8708,11 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT", "peer": true }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9795,8 +8731,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9811,8 +8745,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -9828,8 +8760,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -9841,8 +8771,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -9856,8 +8784,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -9874,8 +8800,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -9891,8 +8815,6 @@ }, "node_modules/is-directory": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "license": "MIT", "peer": true, "engines": { @@ -9901,8 +8823,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "license": "MIT", "peer": true, "bin": { @@ -9917,8 +8837,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -9927,8 +8845,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -9943,8 +8859,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "peer": true, "engines": { @@ -9953,8 +8867,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9972,8 +8884,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -9985,8 +8895,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -9998,8 +8906,6 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -10011,8 +8917,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -10020,8 +8924,6 @@ }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -10037,21 +8939,15 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true, "license": "MIT" }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -10069,8 +8965,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -10082,8 +8976,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -10098,8 +8990,6 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -10115,8 +9005,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -10133,8 +9021,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10149,8 +9035,6 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -10162,8 +9046,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -10178,8 +9060,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10195,8 +9075,6 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "license": "MIT", "peer": true, "dependencies": { @@ -10208,21 +9086,15 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isomorphic-ws": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "license": "MIT", "peerDependencies": { "ws": "*" @@ -10230,8 +9102,6 @@ }, "node_modules/isows": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", - "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", "funding": [ { "type": "github", @@ -10245,8 +9115,6 @@ }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "license": "BSD-3-Clause", "peer": true, "engines": { @@ -10255,8 +9123,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -10272,8 +9138,6 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "peer": true, "bin": { @@ -10282,8 +9146,6 @@ }, "node_modules/jackspeak": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", "peer": true, "dependencies": { @@ -10298,8 +9160,6 @@ }, "node_modules/jayson": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.2.0.tgz", - "integrity": "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==", "license": "MIT", "dependencies": { "@types/connect": "^3.4.33", @@ -10324,41 +9184,14 @@ }, "node_modules/jayson/node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "license": "MIT" }, "node_modules/jayson/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/jayson/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "license": "MIT", "peer": true, "dependencies": { @@ -10375,8 +9208,6 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "license": "MIT", "peer": true, "engines": { @@ -10385,8 +9216,6 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", "peer": true, "dependencies": { @@ -10411,8 +9240,6 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "license": "MIT", "peer": true, "dependencies": { @@ -10430,32 +9257,48 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", - "peer": true + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "license": "MIT", "peer": true, "dependencies": { @@ -10464,41 +9307,86 @@ "jest-util": "^29.7.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", "license": "MIT", "peer": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "has-flag": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "license": "MIT", "peer": true, "dependencies": { @@ -10513,10 +9401,22 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "peer": true, "engines": { @@ -10526,74 +9426,74 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jimp-compact": { "version": "0.16.1", - "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", - "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "license": "MIT", "peer": true }, "node_modules/jose": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.0.13.tgz", - "integrity": "sha512-Yms4GpbmdANamS51kKK6w4hRlKx8KTxbWyAAKT/MhUMtqbIqh5mb2HjhTNUbk7TFL8/MBB5zWSDohL7ed4k/UA==", + "version": "6.0.11", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-base64": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", - "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "version": "3.7.7", "license": "BSD-3-Clause" }, "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" + "version": "4.0.0", + "license": "MIT", + "peer": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", "license": "MIT", + "peer": true, "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -10601,15 +9501,11 @@ }, "node_modules/jsc-safe-url": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "license": "0BSD", "peer": true }, "node_modules/jsdom": { "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -10647,12 +9543,8 @@ } } }, -<<<<<<< HEAD -======= "node_modules/jsdom/node_modules/tr46": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -10664,31 +9556,22 @@ }, "node_modules/jsdom/node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, ->>>>>>> c8ea810 (flesh out) "node_modules/jsdom/node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, -<<<<<<< HEAD -======= "node_modules/jsdom/node_modules/whatwg-url": { "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { @@ -10701,8 +9584,6 @@ }, "node_modules/jsdom/node_modules/ws": { "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -10721,11 +9602,8 @@ } } }, ->>>>>>> c8ea810 (flesh out) "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "peer": true, "bin": { @@ -10737,54 +9615,40 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "license": "MIT", "peer": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, + "version": "2.2.3", "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, + "peer": true, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -10793,8 +9657,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "license": "MIT", "peer": true, "engines": { @@ -10803,352 +9665,137 @@ }, "node_modules/lan-network": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz", - "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==", "license": "MIT", "peer": true, "bin": { "lan-network": "dist/lan-network-cli.js" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/lightningcss": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", - "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", - "license": "MPL-2.0", - "peer": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.27.0", - "lightningcss-darwin-x64": "1.27.0", - "lightningcss-freebsd-x64": "1.27.0", - "lightningcss-linux-arm-gnueabihf": "1.27.0", - "lightningcss-linux-arm64-gnu": "1.27.0", - "lightningcss-linux-arm64-musl": "1.27.0", - "lightningcss-linux-x64-gnu": "1.27.0", - "lightningcss-linux-x64-musl": "1.27.0", - "lightningcss-win32-arm64-msvc": "1.27.0", - "lightningcss-win32-x64-msvc": "1.27.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", - "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", - "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", - "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", - "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", - "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", - "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + } + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", "peer": true, "engines": { - "node": ">= 12.0.0" + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", - "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "license": "Apache-2.0", "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" } }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", - "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", "peer": true, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/lightningcss-win32-arm64-msvc": { + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "license": "MIT", + "peer": true + }, + "node_modules/lightningcss": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", - "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", - "cpu": [ - "arm64" - ], "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, "engines": { "node": ">= 12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.27.0", + "lightningcss-darwin-x64": "1.27.0", + "lightningcss-freebsd-x64": "1.27.0", + "lightningcss-linux-arm-gnueabihf": "1.27.0", + "lightningcss-linux-arm64-gnu": "1.27.0", + "lightningcss-linux-arm64-musl": "1.27.0", + "lightningcss-linux-x64-gnu": "1.27.0", + "lightningcss-linux-x64-musl": "1.27.0", + "lightningcss-win32-arm64-msvc": "1.27.0", + "lightningcss-win32-x64-msvc": "1.27.0" } }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", - "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "1.0.3", + "license": "Apache-2.0", "peer": true, - "engines": { - "node": ">= 12.0.0" + "bin": { + "detect-libc": "bin/detect-libc.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=0.10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT", "peer": true }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "5.0.0", "license": "MIT", + "peer": true, "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT", "peer": true }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.throttle": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "license": "MIT", "peer": true }, "node_modules/log-symbols": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "license": "MIT", "peer": true, "dependencies": { @@ -11160,8 +9807,6 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "peer": true, "dependencies": { @@ -11173,8 +9818,6 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "peer": true, "dependencies": { @@ -11188,8 +9831,6 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "peer": true, "dependencies": { @@ -11198,15 +9839,11 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT", "peer": true }, "node_modules/log-symbols/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "peer": true, "engines": { @@ -11215,8 +9852,6 @@ }, "node_modules/log-symbols/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "peer": true, "engines": { @@ -11225,8 +9860,6 @@ }, "node_modules/log-symbols/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "peer": true, "dependencies": { @@ -11238,8 +9871,6 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "license": "MIT", "peer": true, "dependencies": { @@ -11249,24 +9880,13 @@ "loose-envify": "cli.js" } }, - "node_modules/loose-envify/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "version": "3.1.3", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "license": "ISC", "peer": true, "dependencies": { @@ -11274,19 +9894,15 @@ } }, "node_modules/magic-string": { - "version": "0.30.18", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", - "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "version": "0.30.17", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/makeerror": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -11295,58 +9911,45 @@ }, "node_modules/marky": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", "license": "Apache-2.0", "peer": true }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, + "version": "1.1.0", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/memoize-one": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT", "peer": true }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, + "version": "2.0.0", "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT", "peer": true }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -11355,8 +9958,6 @@ }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { @@ -11364,9 +9965,7 @@ } }, "node_modules/metro": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.1.tgz", - "integrity": "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11385,24 +9984,24 @@ "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.29.1", + "hermes-parser": "0.28.1", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-config": "0.83.1", - "metro-core": "0.83.1", - "metro-file-map": "0.83.1", - "metro-resolver": "0.83.1", - "metro-runtime": "0.83.1", - "metro-source-map": "0.83.1", - "metro-symbolicate": "0.83.1", - "metro-transform-plugins": "0.83.1", - "metro-transform-worker": "0.83.1", + "metro-babel-transformer": "0.82.4", + "metro-cache": "0.82.4", + "metro-cache-key": "0.82.4", + "metro-config": "0.82.4", + "metro-core": "0.82.4", + "metro-file-map": "0.82.4", + "metro-resolver": "0.82.4", + "metro-runtime": "0.82.4", + "metro-source-map": "0.82.4", + "metro-symbolicate": "0.82.4", + "metro-transform-plugins": "0.82.4", + "metro-transform-worker": "0.82.4", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", @@ -11415,75 +10014,63 @@ "metro": "src/cli.js" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-babel-transformer": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.1.tgz", - "integrity": "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.29.1", + "hermes-parser": "0.28.1", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "version": "0.28.1", "license": "MIT", "peer": true }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "version": "0.28.1", "license": "MIT", "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.28.1" } }, "node_modules/metro-cache": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.1.tgz", - "integrity": "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.1" + "metro-core": "0.82.4" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-cache-key": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.1.tgz", - "integrity": "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-config": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.1.tgz", - "integrity": "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11491,34 +10078,30 @@ "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", - "metro": "0.83.1", - "metro-cache": "0.83.1", - "metro-core": "0.83.1", - "metro-runtime": "0.83.1" + "metro": "0.82.4", + "metro-cache": "0.82.4", + "metro-core": "0.82.4", + "metro-runtime": "0.82.4" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-core": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.1.tgz", - "integrity": "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.1" + "metro-resolver": "0.82.4" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-file-map": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.1.tgz", - "integrity": "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11533,13 +10116,11 @@ "walker": "^1.0.7" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-minify-terser": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.1.tgz", - "integrity": "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11547,26 +10128,22 @@ "terser": "^5.15.0" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-resolver": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.1.tgz", - "integrity": "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-runtime": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.1.tgz", - "integrity": "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11574,13 +10151,11 @@ "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-source-map": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.1.tgz", - "integrity": "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11589,26 +10164,24 @@ "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.83.1", + "metro-symbolicate": "0.82.4", "nullthrows": "^1.1.1", - "ob1": "0.83.1", + "ob1": "0.82.4", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-symbolicate": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.1.tgz", - "integrity": "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.83.1", + "metro-source-map": "0.82.4", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" @@ -11617,13 +10190,11 @@ "metro-symbolicate": "src/index.js" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-transform-plugins": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.1.tgz", - "integrity": "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11635,13 +10206,11 @@ "nullthrows": "^1.1.1" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/metro-transform-worker": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.1.tgz", - "integrity": "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { @@ -11650,91 +10219,110 @@ "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "metro": "0.83.1", - "metro-babel-transformer": "0.83.1", - "metro-cache": "0.83.1", - "metro-cache-key": "0.83.1", - "metro-minify-terser": "0.83.1", - "metro-source-map": "0.83.1", - "metro-transform-plugins": "0.83.1", + "metro": "0.82.4", + "metro-babel-transformer": "0.82.4", + "metro-cache": "0.82.4", + "metro-cache-key": "0.82.4", + "metro-minify-terser": "0.82.4", + "metro-source-map": "0.82.4", + "metro-transform-plugins": "0.82.4", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, - "node_modules/metro/node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "node_modules/metro/node_modules/accepts": { + "version": "1.3.8", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.6" + } + }, + "node_modules/metro/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/metro/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/metro/node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "license": "MIT", "peer": true }, "node_modules/metro/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "version": "0.28.1", "license": "MIT", "peer": true }, "node_modules/metro/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "version": "0.28.1", "license": "MIT", "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.28.1" } }, - "node_modules/metro/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/metro/node_modules/mime-db": { + "version": "1.52.0", "license": "MIT", - "peer": true + "peer": true, + "engines": { + "node": ">= 0.6" + } }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/metro/node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "peer": true, - "engines": { - "node": ">=8.3.0" + "dependencies": { + "mime-db": "1.52.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/metro/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=8" } }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -11744,10 +10332,18 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" @@ -11757,21 +10353,17 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -11779,33 +10371,36 @@ }, "node_modules/mimic-fn": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", "peer": true, "engines": { "node": ">=4" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "3.1.2", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11813,8 +10408,6 @@ }, "node_modules/minipass": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "license": "ISC", "peer": true, "engines": { @@ -11823,8 +10416,6 @@ }, "node_modules/minizlib": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", "license": "MIT", "peer": true, "dependencies": { @@ -11836,8 +10427,6 @@ }, "node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "peer": true, "bin": { @@ -11847,16 +10436,18 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mz": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "license": "MIT", "peer": true, "dependencies": { @@ -11867,8 +10458,6 @@ }, "node_modules/nanoid": { "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -11883,17 +10472,19 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -11901,15 +10492,23 @@ }, "node_modules/nested-error-stacks": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "license": "MIT", "peer": true }, + "node_modules/node-abi": { + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-fetch": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -11926,32 +10525,8 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "license": "(BSD-3-Clause OR GPL-2.0)", "peer": true, "engines": { @@ -11960,8 +10535,6 @@ }, "node_modules/node-gyp-build": { "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", "optional": true, "bin": { @@ -11972,15 +10545,11 @@ }, "node_modules/node-int64": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "license": "MIT", "peer": true }, "node_modules/node-mocks-http": { "version": "1.17.2", - "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.17.2.tgz", - "integrity": "sha512-HVxSnjNzE9NzoWMx9T9z4MLqwMpLwVvA0oVZ+L+gXskYXEJ6tFn3Kx4LargoB6ie7ZlCLplv7QbWO6N+MysWGA==", "dev": true, "license": "MIT", "dependencies": { @@ -12011,17 +10580,99 @@ } } }, + "node_modules/node-mocks-http/node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/merge-descriptors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-mocks-http/node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-mocks-http/node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-releases": { "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "license": "MIT", "peer": true }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "peer": true, "engines": { @@ -12030,8 +10681,6 @@ }, "node_modules/npm-package-arg": { "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "license": "ISC", "peer": true, "dependencies": { @@ -12046,44 +10695,34 @@ }, "node_modules/nullthrows": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", "license": "MIT", "peer": true }, "node_modules/nwsapi": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz", - "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", + "version": "2.2.20", "dev": true, "license": "MIT" }, "node_modules/oauth4webapi": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.7.0.tgz", - "integrity": "sha512-Q52wTPUWPsVLVVmTViXPQFMW2h2xv2jnDGxypjpelCFKaOjLsm7AxYuOk1oQgFm95VNDbuggasu9htXrz6XwKw==", + "version": "3.5.1", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/ob1": { - "version": "0.83.1", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.1.tgz", - "integrity": "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ==", + "version": "0.82.4", "license": "MIT", "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=20.19.4" + "node": ">=18.18" } }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12091,8 +10730,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -12103,8 +10740,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -12113,8 +10748,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -12134,8 +10767,6 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12153,8 +10784,6 @@ }, "node_modules/object.groupby": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12168,8 +10797,6 @@ }, "node_modules/object.values": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { @@ -12187,8 +10814,6 @@ }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -12199,8 +10824,6 @@ }, "node_modules/on-headers": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "peer": true, "engines": { @@ -12209,8 +10832,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -12218,8 +10839,6 @@ }, "node_modules/onetime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12231,8 +10850,6 @@ }, "node_modules/open": { "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", "peer": true, "dependencies": { @@ -12248,8 +10865,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -12266,8 +10881,6 @@ }, "node_modules/ora": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", "license": "MIT", "peer": true, "dependencies": { @@ -12284,8 +10897,6 @@ }, "node_modules/ora/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "license": "MIT", "peer": true, "engines": { @@ -12294,8 +10905,6 @@ }, "node_modules/ora/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "peer": true, "dependencies": { @@ -12307,8 +10916,6 @@ }, "node_modules/ora/node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12322,8 +10929,6 @@ }, "node_modules/ora/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "peer": true, "dependencies": { @@ -12332,15 +10937,11 @@ }, "node_modules/ora/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT", "peer": true }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "peer": true, "engines": { @@ -12349,8 +10950,6 @@ }, "node_modules/ora/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "peer": true, "engines": { @@ -12359,8 +10958,6 @@ }, "node_modules/ora/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "license": "MIT", "peer": true, "dependencies": { @@ -12372,8 +10969,6 @@ }, "node_modules/ora/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "peer": true, "dependencies": { @@ -12385,8 +10980,6 @@ }, "node_modules/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -12403,8 +10996,6 @@ }, "node_modules/ox": { "version": "0.8.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.8.7.tgz", - "integrity": "sha512-W1f0FiMf9NZqtHPEDEAEkyzZDwbIKfmH2qmQx8NNiQ/9JhxrSblmtLJsSfTtQG5YKowLOnBlLVguCyxm/7ztxw==", "funding": [ { "type": "github", @@ -12432,39 +11023,32 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "2.3.0", "license": "MIT", + "peer": true, "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "4.1.0", "license": "MIT", + "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "peer": true, "engines": { @@ -12473,15 +11057,11 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0", "peer": true }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -12491,10 +11071,16 @@ "node": ">=6" } }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "license": "MIT", "peer": true, "dependencies": { @@ -12507,8 +11093,6 @@ }, "node_modules/parse-png": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", - "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12520,8 +11104,6 @@ }, "node_modules/parse5": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, "license": "MIT", "dependencies": { @@ -12531,23 +11113,8 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -12555,8 +11122,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", "engines": { "node": ">=8" @@ -12564,8 +11129,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "peer": true, "engines": { @@ -12574,8 +11137,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -12583,14 +11144,10 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", "peer": true, "dependencies": { @@ -12606,15 +11163,11 @@ }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC", "peer": true }, "node_modules/path-to-regexp": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "license": "MIT", "engines": { "node": ">=16" @@ -12622,15 +11175,11 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { @@ -12639,17 +11188,14 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -12657,8 +11203,6 @@ }, "node_modules/pirates": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "license": "MIT", "peer": true, "engines": { @@ -12667,8 +11211,6 @@ }, "node_modules/pkce-challenge": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", "license": "MIT", "engines": { "node": ">=16.20.0" @@ -12676,8 +11218,6 @@ }, "node_modules/plist": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12691,8 +11231,6 @@ }, "node_modules/pngjs": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "license": "MIT", "peer": true, "engines": { @@ -12701,8 +11239,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -12710,9 +11246,7 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.3", "dev": true, "funding": [ { @@ -12730,7 +11264,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -12738,27 +11272,14 @@ "node": "^10 || ^12 || >=14" } }, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) -======= ->>>>>>> 09c3e77 (bookmark) "node_modules/preact": { "version": "10.24.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz", - "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==", "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -12785,29 +11306,8 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, -======= ->>>>>>> a1d033e (npm install) -======= ->>>>>>> 4eb82d9 (Use minikit for wallet access instead of base-org/account API) -======= ->>>>>>> 70bb143 (Try using main account with BasePaymentMaker to sign) -======= ->>>>>>> 2ace185 (Comment out code to get clean build without ox dep TS build issue) -======= ->>>>>>> 09c3e77 (bookmark) "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -12816,8 +11316,6 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "license": "MIT", "peer": true, "engines": { @@ -12829,8 +11327,6 @@ }, "node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12842,23 +11338,8 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/proc-log": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "license": "ISC", "peer": true, "engines": { @@ -12867,8 +11348,6 @@ }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "license": "MIT", "peer": true, "engines": { @@ -12877,8 +11356,6 @@ }, "node_modules/promise": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "license": "MIT", "peer": true, "dependencies": { @@ -12887,8 +11364,6 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "license": "MIT", "peer": true, "dependencies": { @@ -12901,8 +11376,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -12912,25 +11385,29 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qrcode-generator": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.5.2.tgz", - "integrity": "sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw==", + "version": "1.4.4", "license": "MIT" }, "node_modules/qrcode-terminal": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" @@ -12938,8 +11415,6 @@ }, "node_modules/qs": { "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -12953,8 +11428,6 @@ }, "node_modules/queue": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", "peer": true, "dependencies": { @@ -12963,8 +11436,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -12984,8 +11455,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12993,8 +11462,6 @@ }, "node_modules/raw-body": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -13008,10 +11475,7 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "peer": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -13022,19 +11486,8 @@ "rc": "cli.js" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { - "version": "19.1.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", - "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "version": "19.1.0", "license": "MIT", "peer": true, "engines": { @@ -13042,9 +11495,7 @@ } }, "node_modules/react-devtools-core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.5.tgz", - "integrity": "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==", + "version": "6.1.2", "license": "MIT", "peer": true, "dependencies": { @@ -13052,71 +11503,47 @@ "ws": "^7" } }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT", "peer": true }, "node_modules/react-native": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.0.tgz", - "integrity": "sha512-RDWhewHGsAa5uZpwIxnJNiv5tW2y6/DrQUjEBdAHPzGMwuMTshern2s4gZaWYeRU3SQguExVddCjiss9IBhxqA==", + "version": "0.79.3", "license": "MIT", "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.81.0", - "@react-native/codegen": "0.81.0", - "@react-native/community-cli-plugin": "0.81.0", - "@react-native/gradle-plugin": "0.81.0", - "@react-native/js-polyfills": "0.81.0", - "@react-native/normalize-colors": "0.81.0", - "@react-native/virtualized-lists": "0.81.0", + "@react-native/assets-registry": "0.79.3", + "@react-native/codegen": "0.79.3", + "@react-native/community-cli-plugin": "0.79.3", + "@react-native/gradle-plugin": "0.79.3", + "@react-native/js-polyfills": "0.79.3", + "@react-native/normalize-colors": "0.79.3", + "@react-native/virtualized-lists": "0.79.3", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-syntax-hermes-parser": "0.25.1", "base64-js": "^1.5.1", + "chalk": "^4.0.0", "commander": "^12.0.0", + "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.1", - "metro-source-map": "^0.83.1", + "metro-runtime": "^0.82.0", + "metro-source-map": "^0.82.0", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", - "react-devtools-core": "^6.1.5", + "react-devtools-core": "^6.1.1", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", + "scheduler": "0.25.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", @@ -13127,11 +11554,11 @@ "react-native": "cli.js" }, "engines": { - "node": ">= 20.19.4" + "node": ">=18" }, "peerDependencies": { - "@types/react": "^19.1.0", - "react": "^19.1.0" + "@types/react": "^19.0.0", + "react": "^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -13141,8 +11568,6 @@ }, "node_modules/react-native-edge-to-edge": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/react-native-edge-to-edge/-/react-native-edge-to-edge-1.6.0.tgz", - "integrity": "sha512-2WCNdE3Qd6Fwg9+4BpbATUxCLcouF6YRY7K+J36KJ4l3y+tWN6XCqAC4DuoGblAAbb2sLkhEDp4FOlbOIot2Og==", "license": "MIT", "peer": true, "peerDependencies": { @@ -13152,8 +11577,6 @@ }, "node_modules/react-native-url-polyfill": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-native-url-polyfill/-/react-native-url-polyfill-2.0.0.tgz", - "integrity": "sha512-My330Do7/DvKnEvwQc0WdcBnFPploYKp9CYlefDXzIdEaA+PAhDYllkvGeEroEzvc4Kzzj2O4yVdz8v6fjRvhA==", "license": "MIT", "dependencies": { "whatwg-url-without-unicode": "8.0.0-3" @@ -13162,130 +11585,99 @@ "react-native": "*" } }, - "node_modules/react-native/node_modules/@react-native/codegen": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.0.tgz", - "integrity": "sha512-gPFutgtj8YqbwKKt3YpZKamUBGd9YZJV51Jq2aiDZ9oThkg1frUBa20E+Jdi7jKn982wjBMxAklAR85QGQ4xMA==", + "node_modules/react-native/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "glob": "^7.1.1", - "hermes-parser": "0.29.1", - "invariant": "^2.2.4", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 20.19.4" + "node": ">=8" }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.0.tgz", - "integrity": "sha512-3gEu/29uFgz+81hpUgdlOojM4rjHTIPwxpfygFNY60V6ywZih3eLDTS8kAjNZfPFHQbcYrNorJzwnL5yFF/uLw==", - "license": "MIT", - "peer": true - }, - "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "node_modules/react-native/node_modules/chalk": { + "version": "4.1.2", "license": "MIT", "peer": true, "dependencies": { - "hermes-parser": "0.29.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/react-native/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/react-native/node_modules/supports-color": { + "version": "7.2.0", "license": "MIT", "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/react-native/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "peer": true, - "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" + "has-flag": "^4.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/react-native/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT", - "peer": true - }, - "node_modules/react-native/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "node_modules/react-native/node_modules/ws": { + "version": "6.2.3", "license": "MIT", "peer": true, "dependencies": { - "hermes-estree": "0.29.1" + "async-limiter": "~1.0.0" } }, - "node_modules/react-native/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/react-refresh": { + "version": "0.14.2", + "license": "MIT", "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "*" + "node": ">= 6" } }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", "license": "MIT", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "license": "MIT", - "peer": true, + "dependencies": { + "redis-errors": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -13307,15 +11699,11 @@ }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "license": "MIT", "peer": true }, "node_modules/regenerate-unicode-properties": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "license": "MIT", "peer": true, "dependencies": { @@ -13327,15 +11715,11 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT", "peer": true }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -13355,8 +11739,6 @@ }, "node_modules/regexparam": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-3.0.0.tgz", - "integrity": "sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==", "dev": true, "license": "MIT", "engines": { @@ -13365,8 +11747,6 @@ }, "node_modules/regexpu-core": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "license": "MIT", "peer": true, "dependencies": { @@ -13383,15 +11763,11 @@ }, "node_modules/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "license": "MIT", "peer": true }, "node_modules/regjsparser": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -13403,8 +11779,6 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "peer": true, "bin": { @@ -13416,8 +11790,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "peer": true, "engines": { @@ -13426,8 +11798,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "peer": true, "engines": { @@ -13436,8 +11806,6 @@ }, "node_modules/requireg": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", "peer": true, "dependencies": { "nested-error-stacks": "~2.0.1", @@ -13450,8 +11818,6 @@ }, "node_modules/requireg/node_modules/resolve": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "license": "MIT", "peer": true, "dependencies": { @@ -13460,8 +11826,6 @@ }, "node_modules/resolve": { "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", @@ -13479,19 +11843,15 @@ } }, "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "version": "5.0.0", "license": "MIT", + "peer": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { @@ -13500,15 +11860,11 @@ }, "node_modules/resolve-workspace-root": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", - "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", "license": "MIT", "peer": true }, "node_modules/resolve.exports": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "license": "MIT", "peer": true, "engines": { @@ -13517,8 +11873,6 @@ }, "node_modules/restore-cursor": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", "peer": true, "dependencies": { @@ -13529,17 +11883,8 @@ "node": ">=4" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true - }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -13549,9 +11894,6 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "peer": true, "dependencies": { @@ -13564,60 +11906,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "peer": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/rollup": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.48.1.tgz", - "integrity": "sha512-jVG20NvbhTYDkGAty2/Yh7HK6/q3DGSRH4o8ALKGArmMuaauM9kLfoMZ+WliPwA5+JHr2lTn3g557FxBV87ifg==", + "version": "4.40.2", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -13627,33 +11921,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.48.1", - "@rollup/rollup-android-arm64": "4.48.1", - "@rollup/rollup-darwin-arm64": "4.48.1", - "@rollup/rollup-darwin-x64": "4.48.1", - "@rollup/rollup-freebsd-arm64": "4.48.1", - "@rollup/rollup-freebsd-x64": "4.48.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.48.1", - "@rollup/rollup-linux-arm-musleabihf": "4.48.1", - "@rollup/rollup-linux-arm64-gnu": "4.48.1", - "@rollup/rollup-linux-arm64-musl": "4.48.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.48.1", - "@rollup/rollup-linux-ppc64-gnu": "4.48.1", - "@rollup/rollup-linux-riscv64-gnu": "4.48.1", - "@rollup/rollup-linux-riscv64-musl": "4.48.1", - "@rollup/rollup-linux-s390x-gnu": "4.48.1", - "@rollup/rollup-linux-x64-gnu": "4.48.1", - "@rollup/rollup-linux-x64-musl": "4.48.1", - "@rollup/rollup-win32-arm64-msvc": "4.48.1", - "@rollup/rollup-win32-ia32-msvc": "4.48.1", - "@rollup/rollup-win32-x64-msvc": "4.48.1", + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" } }, "node_modules/router": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -13666,19 +11958,8 @@ "node": ">= 18" } }, - "node_modules/router/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/rpc-websockets": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.1.3.tgz", - "integrity": "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA==", + "version": "9.1.1", "license": "LGPL-3.0-only", "dependencies": { "@swc/helpers": "^0.5.11", @@ -13700,24 +11981,37 @@ }, "node_modules/rpc-websockets/node_modules/@types/ws": { "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/rpc-websockets/node_modules/ws": { + "version": "8.18.2", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/rrweb-cssom": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true, "license": "MIT" }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -13740,8 +12034,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13760,8 +12052,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -13780,8 +12070,6 @@ }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -13797,8 +12085,6 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { @@ -13815,21 +12101,15 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sax": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC", "peer": true }, "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, "license": "ISC", "dependencies": { @@ -13840,16 +12120,12 @@ } }, "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "version": "0.25.0", "license": "MIT", "peer": true }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.1", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -13859,71 +12135,27 @@ } }, "node_modules/send": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", - "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "version": "1.2.0", "license": "MIT", - "peer": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "node": ">= 18" } }, "node_modules/serialize-error": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "license": "MIT", "peer": true, "engines": { @@ -13931,97 +12163,20 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "peer": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true - }, - "node_modules/serve-static/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "2.2.0", "license": "MIT", - "peer": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "node": ">= 18" } }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -14038,8 +12193,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14054,8 +12207,6 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -14069,14 +12220,10 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -14087,8 +12234,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", "engines": { "node": ">=8" @@ -14096,8 +12241,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "license": "MIT", "peer": true, "engines": { @@ -14109,8 +12252,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -14128,8 +12269,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -14144,8 +12283,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -14162,47 +12299,78 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC", + "peer": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, "node_modules/simple-plist": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", - "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "license": "MIT", "peer": true, "dependencies": { @@ -14213,8 +12381,6 @@ }, "node_modules/simple-plist/node_modules/bplist-parser": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", - "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", "license": "MIT", "peer": true, "dependencies": { @@ -14226,15 +12392,11 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT", "peer": true }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "peer": true, "engines": { @@ -14243,8 +12405,6 @@ }, "node_modules/slugify": { "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "license": "MIT", "peer": true, "engines": { @@ -14253,8 +12413,6 @@ }, "node_modules/source-map": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "peer": true, "engines": { @@ -14263,8 +12421,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -14272,8 +12428,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", "peer": true, "dependencies": { @@ -14283,8 +12437,6 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "peer": true, "engines": { @@ -14293,15 +12445,11 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause", "peer": true }, "node_modules/stack-utils": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "license": "MIT", "peer": true, "dependencies": { @@ -14313,8 +12461,6 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "license": "MIT", "peer": true, "engines": { @@ -14323,22 +12469,16 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/stackframe": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT", "peer": true }, "node_modules/stacktrace-parser": { "version": "0.1.11", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", - "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "license": "MIT", "peer": true, "dependencies": { @@ -14348,10 +12488,14 @@ "node": ">=6" } }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "version": "2.0.1", "license": "MIT", "engines": { "node": ">= 0.8" @@ -14359,15 +12503,11 @@ }, "node_modules/std-env": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", "dev": true, "license": "MIT" }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14380,8 +12520,6 @@ }, "node_modules/stream-buffers": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "license": "Unlicense", "peer": true, "engines": { @@ -14390,42 +12528,26 @@ }, "node_modules/stream-chain": { "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", "license": "BSD-3-Clause" }, "node_modules/stream-json": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", - "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", "license": "BSD-3-Clause", "dependencies": { "stream-chain": "^2.2.5" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", - "peer": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "safe-buffer": "~5.2.0" } }, - "node_modules/string-width-cjs": { - "name": "string-width", + "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "peer": true, "dependencies": { @@ -14437,21 +12559,15 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "license": "MIT", "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -14459,8 +12575,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { @@ -14481,8 +12595,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14500,8 +12612,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -14517,26 +12627,19 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "6.0.1", "license": "MIT", "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "peer": true, "dependencies": { @@ -14546,23 +12649,8 @@ "node": ">=8" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -14570,43 +12658,19 @@ } }, "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "version": "2.0.1", "license": "MIT", - "peer": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "node": ">=0.10.0" } }, "node_modules/structured-headers": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", - "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "license": "MIT", "peer": true }, "node_modules/sucrase": { "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "license": "MIT", "peer": true, "dependencies": { @@ -14626,20 +12690,57 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "license": "MIT", "peer": true, "engines": { "node": ">= 6" } }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/superagent": { "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", "dev": true, "license": "MIT", "dependencies": { @@ -14659,8 +12760,6 @@ }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", "bin": { @@ -14672,8 +12771,6 @@ }, "node_modules/superstruct": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -14681,8 +12778,6 @@ }, "node_modules/supertest": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", - "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", "dev": true, "license": "MIT", "dependencies": { @@ -14694,21 +12789,21 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "license": "MIT", "peer": true, "dependencies": { @@ -14719,10 +12814,19 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -14733,15 +12837,11 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, "license": "MIT" }, "node_modules/tar": { "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", "license": "ISC", "peer": true, "dependencies": { @@ -14756,10 +12856,42 @@ "node": ">=18" } }, + "node_modules/tar-fs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "license": "MIT", "peer": true, "bin": { @@ -14774,8 +12906,6 @@ }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "license": "BlueOak-1.0.0", "peer": true, "engines": { @@ -14784,8 +12914,6 @@ }, "node_modules/temp-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "license": "MIT", "peer": true, "engines": { @@ -14794,8 +12922,6 @@ }, "node_modules/terminal-link": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "license": "MIT", "peer": true, "dependencies": { @@ -14810,9 +12936,7 @@ } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.40.0", "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -14830,15 +12954,11 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT", "peer": true }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "license": "ISC", "peer": true, "dependencies": { @@ -14850,61 +12970,11 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "peer": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" + "version": "1.0.2" }, "node_modules/thenify": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "license": "MIT", "peer": true, "dependencies": { @@ -14913,8 +12983,6 @@ }, "node_modules/thenify-all": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "license": "MIT", "peer": true, "dependencies": { @@ -14926,29 +12994,21 @@ }, "node_modules/throat": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT", "peer": true }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.13", "dev": true, "license": "MIT", "dependencies": { @@ -14962,41 +13022,8 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "version": "1.0.2", "dev": true, "license": "MIT", "engines": { @@ -15005,8 +13032,6 @@ }, "node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { @@ -15014,9 +13039,7 @@ } }, "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "3.0.2", "dev": true, "license": "MIT", "engines": { @@ -15025,8 +13048,6 @@ }, "node_modules/tldts": { "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15038,22 +13059,16 @@ }, "node_modules/tldts-core": { "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, "license": "MIT" }, "node_modules/tmpl": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "license": "BSD-3-Clause", "peer": true }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -15064,8 +13079,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -15073,34 +13086,21 @@ }, "node_modules/tough-cookie": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" }, "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" + "node": ">=16" } }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { @@ -15112,15 +13112,11 @@ }, "node_modules/ts-interface-checker": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0", "peer": true }, "node_modules/tsconfig-paths": { "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { @@ -15130,16 +13126,23 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", - "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", + "version": "4.19.4", "dev": true, "license": "MIT", "dependencies": { @@ -15156,22 +13159,28 @@ "fsevents": "~2.3.3" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/tweetnacl": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "license": "Unlicense" }, "node_modules/tweetnacl-util": { "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", "license": "Unlicense" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -15183,8 +13192,6 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "license": "MIT", "peer": true, "engines": { @@ -15193,8 +13200,6 @@ }, "node_modules/type-fest": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "license": "(MIT OR CC0-1.0)", "peer": true, "engines": { @@ -15202,14 +13207,12 @@ } }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, + "version": "2.0.1", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" @@ -15217,8 +13220,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -15232,8 +13233,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -15252,8 +13251,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15274,8 +13271,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -15294,9 +13289,7 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.8.3", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -15308,8 +13301,6 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -15327,8 +13318,6 @@ }, "node_modules/undici": { "version": "6.21.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.3.tgz", - "integrity": "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==", "license": "MIT", "peer": true, "engines": { @@ -15337,14 +13326,10 @@ }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "license": "MIT", "peer": true, "engines": { @@ -15353,8 +13338,6 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "license": "MIT", "peer": true, "dependencies": { @@ -15367,8 +13350,6 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "license": "MIT", "peer": true, "engines": { @@ -15377,8 +13358,6 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "license": "MIT", "peer": true, "engines": { @@ -15387,8 +13366,6 @@ }, "node_modules/unique-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "license": "MIT", "peer": true, "dependencies": { @@ -15400,8 +13377,6 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -15409,8 +13384,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -15440,8 +13413,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -15449,8 +13420,6 @@ }, "node_modules/utf-8-validate": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -15461,10 +13430,14 @@ "node": ">=6.14.2" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", "peer": true, "engines": { @@ -15473,8 +13446,6 @@ }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -15482,8 +13453,6 @@ }, "node_modules/validate-npm-package-name": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "license": "ISC", "peer": true, "engines": { @@ -15492,17 +13461,13 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/viem": { - "version": "2.35.1", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.35.1.tgz", - "integrity": "sha512-BVGrI2xzMa+cWaUhhMuq+RV6t/8aHN08QAPG07OMFb3PBWc0AYubRMyIuxMKncFe8lJdxfRWNRYv1agoM/xSlQ==", + "version": "2.34.0", "funding": [ { "type": "github", @@ -15529,40 +13494,42 @@ } } }, - "node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.6.tgz", - "integrity": "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==", + "node_modules/viem/node_modules/ws": { + "version": "8.18.3", "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, "engines": { - "node": "^14.21.3 || >=16" + "node": ">=10.0.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/vite": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", + "version": "6.3.5", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -15571,14 +13538,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", - "less": "^4.0.0", + "less": "*", "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -15620,17 +13587,15 @@ } }, "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.4.1", + "debug": "^4.4.0", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" @@ -15642,66 +13607,31 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "3.1.3", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", + "@vitest/expect": "3.1.3", + "@vitest/mocker": "3.1.3", + "@vitest/pretty-format": "^3.1.3", + "@vitest/runner": "3.1.3", + "@vitest/snapshot": "3.1.3", + "@vitest/spy": "3.1.3", + "@vitest/utils": "3.1.3", "chai": "^5.2.0", - "debug": "^4.4.1", + "debug": "^4.4.0", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", + "tinyglobby": "^0.2.13", + "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.3", "why-is-node-running": "^2.3.0" }, "bin": { @@ -15717,8 +13647,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@vitest/browser": "3.1.3", + "@vitest/ui": "3.1.3", "happy-dom": "*", "jsdom": "*" }, @@ -15746,30 +13676,13 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vlq": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "license": "MIT", "peer": true }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", "dependencies": { @@ -15781,8 +13694,6 @@ }, "node_modules/walker": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -15791,8 +13702,6 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "peer": true, "dependencies": { @@ -15800,32 +13709,11 @@ } }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } + "version": "3.0.1", + "license": "BSD-2-Clause" }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15837,15 +13725,11 @@ }, "node_modules/whatwg-fetch": { "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT", "peer": true }, "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "license": "MIT", "engines": { @@ -15853,23 +13737,15 @@ } }, "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, + "version": "5.0.0", "license": "MIT", "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", - "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", - "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", "license": "MIT", "dependencies": { "buffer": "^5.4.3", @@ -15882,8 +13758,6 @@ }, "node_modules/whatwg-url-without-unicode/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -15906,8 +13780,6 @@ }, "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", "license": "BSD-2-Clause", "engines": { "node": ">=8" @@ -15915,8 +13787,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -15930,8 +13800,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -15950,8 +13818,6 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -15978,8 +13844,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -15997,8 +13861,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { @@ -16019,8 +13881,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -16036,15 +13896,11 @@ }, "node_modules/wonka": { "version": "6.3.5", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz", - "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==", "license": "MIT", "peer": true }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -16053,8 +13909,6 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "peer": true, "dependencies": { @@ -16072,8 +13926,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "peer": true, "dependencies": { @@ -16088,86 +13940,40 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", "license": "MIT", "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "license": "ISC", "peer": true, "dependencies": { @@ -16178,24 +13984,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true - }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "7.5.10", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -16208,8 +14005,6 @@ }, "node_modules/xcode": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", - "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -16222,8 +14017,6 @@ }, "node_modules/xcode/node_modules/uuid": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "license": "MIT", "peer": true, "bin": { @@ -16232,8 +14025,6 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -16242,8 +14033,6 @@ }, "node_modules/xml2js": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", - "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", "license": "MIT", "peer": true, "dependencies": { @@ -16256,8 +14045,6 @@ }, "node_modules/xml2js/node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "license": "MIT", "peer": true, "engines": { @@ -16266,8 +14053,6 @@ }, "node_modules/xmlbuilder": { "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", "peer": true, "engines": { @@ -16276,15 +14061,11 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "peer": true, "engines": { @@ -16293,15 +14074,11 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC", "peer": true }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "peer": true, "dependencies": { @@ -16319,53 +14096,14 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "peer": true, "engines": { "node": ">=12" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", "engines": { "node": ">=10" @@ -16375,18 +14113,14 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "3.25.42", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.24.6", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", - "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "version": "3.24.5", "license": "ISC", "peerDependencies": { "zod": "^3.24.1" @@ -16394,8 +14128,6 @@ }, "node_modules/zustand": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", - "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", "license": "MIT", "engines": { "node": ">=12.20.0" @@ -16446,6 +14178,43 @@ "vitest": "^3.0.9" } }, + "packages/atxp-base/node_modules/@atxp/client": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@atxp/client/-/client-0.2.10.tgz", + "integrity": "sha512-NdVtQ1ZReWuPoyCk7e3F2Pe1l+9e6cxNNrArmBtsVz2RKI11ONacaDHLi+4/tGnLKEjQJ6cC+uEhzYZ44VHamQ==", + "license": "MIT", + "dependencies": { + "@atxp/common": "0.2.10", + "@modelcontextprotocol/sdk": "^1.15.0", + "@solana/pay": "^0.2.5", + "@solana/web3.js": "^1.98.1", + "better-sqlite3": "^12.2.0", + "bignumber.js": "^9.3.0", + "bs58": "^6.0.0", + "oauth4webapi": "^3.5.0", + "react-native-url-polyfill": "^2.0.0", + "viem": "^2.34.0" + }, + "peerDependencies": { + "expo-crypto": ">=14.0.0", + "expo-sqlite": ">=15.0.0" + } + }, + "packages/atxp-base/node_modules/@atxp/common": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@atxp/common/-/common-0.2.10.tgz", + "integrity": "sha512-fR5xJOE0nhI36KMez5sQO8q5MGH6L1PQatdmr32ggsME/z2BfrYdaKc/SFucpunx8ya9GmJadIcLC7gJs/8gFg==", + "license": "MIT", + "dependencies": { + "better-sqlite3": "^12.2.0", + "bignumber.js": "^9.3.0", + "ioredis": "^5.7.0", + "jose": "^6.0.11", + "oauth4webapi": "^3.5.0", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + } + }, "packages/atxp-client": { "name": "@atxp/client", "version": "0.2.13", @@ -16478,20 +14247,6 @@ "expo-crypto": ">=14.0.0" } }, -<<<<<<< HEAD - "packages/atxp-client/node_modules/base-x": { - "version": "5.0.1", - "license": "MIT" - }, - "packages/atxp-client/node_modules/bs58": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^5.0.0" - } - }, -======= ->>>>>>> c8ea810 (flesh out) "packages/atxp-common": { "name": "@atxp/common", "version": "0.2.13", @@ -16513,26 +14268,11 @@ "vitest": "^3.0.9" } }, -<<<<<<< HEAD -<<<<<<< HEAD - "packages/atxp-redis": { - "name": "@atxp/redis", - "version": "0.2.13", -======= -<<<<<<< HEAD -======= ->>>>>>> a1d033e (npm install) "packages/atxp-common/node_modules/cssstyle": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, ->>>>>>> c8ea810 (flesh out) "license": "MIT", "dependencies": { -<<<<<<< HEAD - "@atxp/common": "0.2.13", -======= "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" }, @@ -16542,15 +14282,11 @@ }, "packages/atxp-common/node_modules/cssstyle/node_modules/rrweb-cssom": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", "dev": true, "license": "MIT" }, "packages/atxp-common/node_modules/data-urls": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { @@ -16563,8 +14299,6 @@ }, "packages/atxp-common/node_modules/html-encoding-sniffer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16576,8 +14310,6 @@ }, "packages/atxp-common/node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -16590,8 +14322,6 @@ }, "packages/atxp-common/node_modules/jsdom": { "version": "25.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", - "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -16631,8 +14361,6 @@ }, "packages/atxp-common/node_modules/tough-cookie": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -16644,8 +14372,6 @@ }, "packages/atxp-common/node_modules/tr46": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, "license": "MIT", "dependencies": { @@ -16657,8 +14383,6 @@ }, "packages/atxp-common/node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", "dependencies": { @@ -16670,8 +14394,6 @@ }, "packages/atxp-common/node_modules/webidl-conversions": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -16680,8 +14402,6 @@ }, "packages/atxp-common/node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16693,8 +14413,6 @@ }, "packages/atxp-common/node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { @@ -16703,8 +14421,6 @@ }, "packages/atxp-common/node_modules/whatwg-url": { "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, "license": "MIT", "dependencies": { @@ -16717,8 +14433,6 @@ }, "packages/atxp-common/node_modules/ws": { "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -16739,22 +14453,18 @@ }, "packages/atxp-common/node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18" } }, - "packages/atxp-redis-db": { - "name": "@atxp/redis-db", - "version": "0.2.10", - "extraneous": true, + "packages/atxp-redis": { + "name": "@atxp/redis", + "version": "0.2.13", "license": "MIT", "dependencies": { - "@atxp/common": "^0.2.10", ->>>>>>> a1d033e (npm install) + "@atxp/common": "0.2.13", "ioredis": "^5.7.0" }, "devDependencies": { @@ -16791,16 +14501,9 @@ "vitest": "^3.0.9" } }, -<<<<<<< HEAD "packages/atxp-sqlite": { "name": "@atxp/sqlite", "version": "0.2.13", -======= - "packages/atxp-sqlite-db": { - "name": "@atxp/sqlite-db", - "version": "0.2.10", - "extraneous": true, ->>>>>>> a1d033e (npm install) "license": "MIT", "dependencies": { "@atxp/common": "0.2.13", From 7b5d61c82f010bd4fe3e669dba443cc1e6b86495 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 09:29:17 -0700 Subject: [PATCH 44/53] Rebase build issues --- packages/atxp-base/src/baseAppPaymentMaker.ts | 5 ++--- packages/atxp-client/src/baseAccount.ts | 2 ++ .../src/basePaymentMaker.insufficientFunds.test.ts | 3 ++- packages/atxp-client/src/basePaymentMaker.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 5a705885..6e51b3aa 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,4 +1,4 @@ -import type { PaymentMaker } from '@atxp/client'; +import { USDC_CONTRACT_ADDRESS_BASE, type PaymentMaker } from '@atxp/client'; import { Logger, Currency, ConsoleLogger } from '@atxp/common'; import { BigNumber } from 'bignumber.js'; import { Address, parseEther, encodeFunctionData } from 'viem'; @@ -18,7 +18,6 @@ function toBase64Url(data: string): string { } const USDC_DECIMALS = 6; -const USDC_CONTRACT_ADDRESS_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // Minimal ERC20 ABI for transfer function const ERC20_ABI = [ @@ -142,7 +141,7 @@ export class BaseAppPaymentMaker implements PaymentMaker { return encodedAuth; } - async makePayment(amount: BigNumber, currency: Currency, receiver: string): Promise { + async makePayment(amount: BigNumber, currency: string, receiver: string, memo: string): Promise { if (currency !== 'USDC') { throw new Error('Only usdc currency is supported; received ' + currency); } diff --git a/packages/atxp-client/src/baseAccount.ts b/packages/atxp-client/src/baseAccount.ts index 2b4fea3d..6617f1ba 100644 --- a/packages/atxp-client/src/baseAccount.ts +++ b/packages/atxp-client/src/baseAccount.ts @@ -4,6 +4,8 @@ import { BasePaymentMaker } from './basePaymentMaker.js'; import { createWalletClient, http } from 'viem'; import { base } from 'viem/chains'; +export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet + export class BaseAccount implements Account { accountId: string; paymentMakers: { [key: string]: PaymentMaker }; diff --git a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts index f3cbe0fb..bb22902b 100644 --- a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts +++ b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts @@ -5,6 +5,7 @@ import { BigNumber } from 'bignumber.js'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; import { createWalletClient, http } from 'viem'; import { base } from 'viem/chains'; +import { USDC_CONTRACT_ADDRESS_BASE } from './baseAccount.js'; // Mock viem functions vi.mock('viem', () => ({ @@ -106,7 +107,7 @@ describe('BasePaymentMaker insufficient funds handling', () => { // Verify balance was checked expect(mockSigningClient.readContract).toHaveBeenCalledWith({ - address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + address: USDC_CONTRACT_ADDRESS_BASE, abi: expect.any(Array), functionName: 'balanceOf', args: ['0xtest-address'], diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 53ca820b..8d550443 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -18,6 +18,7 @@ import { // import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; import { BigNumber } from "bignumber.js"; +import { USDC_CONTRACT_ADDRESS_BASE } from './baseAccount.js'; // Type for the extended wallet client with public actions type ExtendedWalletClient = WalletClient & PublicActions; @@ -32,7 +33,6 @@ function toBase64Url(data: string): string { return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } -export const USDC_CONTRACT_ADDRESS_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base mainnet const USDC_DECIMALS = 6; const ERC20_ABI = [ { From 29c2cc3ec05d6fd6391317758bd5dea1369444d0 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 09:45:47 -0700 Subject: [PATCH 45/53] Build cleanup --- package-lock.json | 65 ++------------------------------ package.json | 2 +- packages/atxp-base/package.json | 6 +-- packages/atxp-base/tsconfig.json | 7 ++-- 4 files changed, 11 insertions(+), 69 deletions(-) diff --git a/package-lock.json b/package-lock.json index f85bd439..4cc3f4ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5338,13 +5338,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/await-lock": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", - "license": "MIT", - "peer": true - }, "node_modules/babel-jest": { "version": "29.7.0", "license": "MIT", @@ -7749,21 +7742,6 @@ "invariant": "^2.2.4" } }, - "node_modules/expo-sqlite": { - "version": "15.2.14", - "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-15.2.14.tgz", - "integrity": "sha512-6tWnEE0fcir30/e7eVwjeC7eKdncfVnIgo2JvnKpRndedyiFMXLMyOQWNVGnuhnSrPV2BHvGGjLByS/j5VgH4w==", - "license": "MIT", - "peer": true, - "dependencies": { - "await-lock": "^2.2.2" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, "node_modules/exponential-backoff": { "version": "3.1.2", "license": "Apache-2.0", @@ -14155,11 +14133,11 @@ }, "packages/atxp-base": { "name": "@atxp/base", - "version": "0.2.10", + "version": "0.2.13", "license": "MIT", "dependencies": { - "@atxp/client": "0.2.10", - "@atxp/common": "0.2.10", + "@atxp/client": "0.2.13", + "@atxp/common": "0.2.13", "@base-org/account": "^2.0.2", "bignumber.js": "^9.3.0", "viem": "^2.34.0" @@ -14178,43 +14156,6 @@ "vitest": "^3.0.9" } }, - "packages/atxp-base/node_modules/@atxp/client": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@atxp/client/-/client-0.2.10.tgz", - "integrity": "sha512-NdVtQ1ZReWuPoyCk7e3F2Pe1l+9e6cxNNrArmBtsVz2RKI11ONacaDHLi+4/tGnLKEjQJ6cC+uEhzYZ44VHamQ==", - "license": "MIT", - "dependencies": { - "@atxp/common": "0.2.10", - "@modelcontextprotocol/sdk": "^1.15.0", - "@solana/pay": "^0.2.5", - "@solana/web3.js": "^1.98.1", - "better-sqlite3": "^12.2.0", - "bignumber.js": "^9.3.0", - "bs58": "^6.0.0", - "oauth4webapi": "^3.5.0", - "react-native-url-polyfill": "^2.0.0", - "viem": "^2.34.0" - }, - "peerDependencies": { - "expo-crypto": ">=14.0.0", - "expo-sqlite": ">=15.0.0" - } - }, - "packages/atxp-base/node_modules/@atxp/common": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@atxp/common/-/common-0.2.10.tgz", - "integrity": "sha512-fR5xJOE0nhI36KMez5sQO8q5MGH6L1PQatdmr32ggsME/z2BfrYdaKc/SFucpunx8ya9GmJadIcLC7gJs/8gFg==", - "license": "MIT", - "dependencies": { - "better-sqlite3": "^12.2.0", - "bignumber.js": "^9.3.0", - "ioredis": "^5.7.0", - "jose": "^6.0.11", - "oauth4webapi": "^3.5.0", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - } - }, "packages/atxp-client": { "name": "@atxp/client", "version": "0.2.13", diff --git a/package.json b/package.json index fb1a9e9c..3e7786e8 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "authorization" ], "scripts": { - "clean": "rm -rf packages/*/dist packages/*/tsconfig.tsbuildinfo", + "clean": "rm -rf packages/*/dist packages/*/tsconfig.tsbuildinfo packages/*/node_modules", "build": "npm run build --workspaces --if-present", "build:dev": "tsc", "typecheck": "npm run typecheck --workspaces --if-present", diff --git a/packages/atxp-base/package.json b/packages/atxp-base/package.json index a038aaff..e3cde83b 100644 --- a/packages/atxp-base/package.json +++ b/packages/atxp-base/package.json @@ -1,6 +1,6 @@ { "name": "@atxp/base", - "version": "0.2.10", + "version": "0.2.13", "description": "ATXP for Base Mini Apps", "license": "MIT", "repository": { @@ -22,8 +22,8 @@ "test": "vitest run" }, "dependencies": { - "@atxp/client": "0.2.10", - "@atxp/common": "0.2.10", + "@atxp/client": "0.2.13", + "@atxp/common": "0.2.13", "@base-org/account": "^2.0.2", "bignumber.js": "^9.3.0", "viem": "^2.34.0" diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index c6cadaff..e1cab11e 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { "target": "ES2020", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "module": "ESNext", + "moduleResolution": "bundler", "lib": ["ES2020", "DOM"], "outDir": "./dist", "rootDir": "./src", @@ -20,6 +20,7 @@ "include": ["src/**/*.ts"], "exclude": ["node_modules", "dist", "**/*.test.ts"], "references": [ - { "path": "../atxp-common" } + { "path": "../atxp-common" }, + { "path": "../atxp-client" } ] } From 24df2e4a1cf7d4039811346b99ed4bd02b5a0a6a Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 09:56:05 -0700 Subject: [PATCH 46/53] Clean up extraneous params --- packages/atxp-base/src/baseAppAccount.ts | 216 +----------------- packages/atxp-base/src/baseAppPaymentMaker.ts | 16 +- packages/atxp-client/src/basePaymentMaker.ts | 13 -- 3 files changed, 14 insertions(+), 231 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 7d60c1ef..2323ba2c 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -1,9 +1,7 @@ import type { Account, PaymentMaker } from '@atxp/client'; import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; -import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts'; -import type { WalletClient } from 'viem'; -import { getAddress, createPublicClient, http, Account as ViemAccount } from 'viem'; +import { generatePrivateKey } from 'viem/accounts'; import { base } from 'viem/chains'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; @@ -23,20 +21,17 @@ export class BaseAppAccount implements Account { return `atxp-base-permission-${userWalletAddress}`; } - static async initialize( - baseRPCUrl: string, - userWalletAddress: string, - walletClient: WalletClient, - config: { + static async initialize(config: { + userWalletAddress: string, appName: string; + apiKey: string; allowance?: bigint; periodInDays?: number; storage?: IStorage; - apiKey: string; + logger?: Logger }, - logger?: Logger, ): Promise { - logger = logger || new ConsoleLogger(); + const logger = config.logger || new ConsoleLogger(); // Validate smart wallet configuration if (!config.apiKey) { throw new Error( @@ -48,15 +43,13 @@ export class BaseAppAccount implements Account { // Initialize storage const baseStorage = config?.storage || new BrowserStorage(); const storage = new IntermediaryStorage(baseStorage); - const storageKey = this.toStorageKey(userWalletAddress); + const storageKey = this.toStorageKey(config.userWalletAddress); // Try to load existing permission const existingData = this.loadSavedWalletAndPermission(storage, storageKey); if (existingData) { const ephemeralSmartWallet = await toEphemeralSmartWallet(existingData.privateKey, config.apiKey); - //const account = privateKeyToAccount(existingData.privateKey); - // The constructor now expects a WalletClient, not individual parameters - return new BaseAppAccount(baseRPCUrl, existingData.permission, ephemeralSmartWallet, logger); + return new BaseAppAccount(existingData.permission, ephemeralSmartWallet, logger); } const sdk = createBaseAccountSDK({ @@ -72,10 +65,10 @@ export class BaseAppAccount implements Account { const privateKey = generatePrivateKey(); const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); console.log('Generated ephemeral wallet:', smartWallet.address); - await this.deploySmartWallet(smartWallet, config.apiKey); + await this.deploySmartWallet(smartWallet); const permission = await requestSpendPermission({ - account: userWalletAddress, + account: config.userWalletAddress, spender: smartWallet.address, token: USDC_CONTRACT_ADDRESS_BASE, chainId: base.id, @@ -89,8 +82,7 @@ export class BaseAppAccount implements Account { // Save wallet and permission storage.set(storageKey, {privateKey, permission}); - //return new BaseAppAccount(baseRPCUrl, permission, account, smartWallet, logger); - return new BaseAppAccount(baseRPCUrl, permission, smartWallet, logger); + return new BaseAppAccount(permission, smartWallet, logger); } private static loadSavedWalletAndPermission( @@ -111,152 +103,8 @@ export class BaseAppAccount implements Account { return storedData; } - /* - private static async checkAndRequestUSDCApproval( - baseRPCUrl: string, - userWalletAddress: string, - walletClient: WalletClient - ): Promise { - const USDC_CONTRACT = getAddress('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'); - const SPEND_PERMISSION_MANAGER = getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); - - const publicClient = createPublicClient({ - chain: base, - transport: http(baseRPCUrl) - }); - - const allowance = await publicClient.readContract({ - address: USDC_CONTRACT, - abi: [{ - name: 'allowance', - type: 'function', - stateMutability: 'view', - inputs: [ - { name: 'owner', type: 'address' }, - { name: 'spender', type: 'address' } - ], - outputs: [{ name: '', type: 'uint256' }], - }], - functionName: 'allowance', - args: [userWalletAddress as `0x${string}`, SPEND_PERMISSION_MANAGER], - }); - - console.log('USDC allowance for SpendPermissionManager:', allowance); - - if (allowance === 0n) { - try { - const hash = await walletClient.writeContract({ - address: USDC_CONTRACT, - abi: [{ - name: 'approve', - type: 'function', - stateMutability: 'nonpayable', - inputs: [ - { name: 'spender', type: 'address' }, - { name: 'amount', type: 'uint256' } - ], - outputs: [{ name: '', type: 'bool' }], - }], - functionName: 'approve', - args: [SPEND_PERMISSION_MANAGER, BigInt(10 ** 9)], // Approve 1000 USDC - chain: base, - account: userWalletAddress as `0x${string}`, - }); - - console.log('Approval transaction sent:', hash); - - // Wait for approval - await publicClient.waitForTransactionReceipt({ hash }); - console.log('SpendPermissionManager approved successfully'); - } catch (approveError) { - console.error('Failed to approve SpendPermissionManager:', approveError); - throw new Error('SpendPermissionManager must be approved to spend USDC. Please approve the contract at 0xf85210B21cC50302F477BA56686d2019dC9b67Ad'); - } - } - } - - private static async createSpendPermission( - userWalletAddress: string, - walletClient: WalletClient, - //privateKey: `0x${string}`, - spenderAddress: string, - config: { - appName: string; - allowance?: bigint; - periodInDays?: number; - apiKey: string; - } - ): Promise { - //const spenderAddress = await getSmartWalletAddress(privateKey, config.apiKey); - - const now = Math.floor(Date.now() / 1000); - const period = (config?.periodInDays ?? DEFAULT_PERIOD_IN_DAYS) * 24 * 60 * 60; - const end = now + period; - - const domain = { - name: 'SpendPermissionManager', - version: '1', - chainId: base.id, - verifyingContract: getAddress('0xf85210B21cC50302F477BA56686d2019dC9b67Ad'), - }; - - const types = { - SpendPermission: [ - { name: 'account', type: 'address' }, - { name: 'spender', type: 'address' }, - { name: 'token', type: 'address' }, - { name: 'allowance', type: 'uint160' }, - { name: 'period', type: 'uint48' }, - { name: 'start', type: 'uint48' }, - { name: 'end', type: 'uint48' }, - { name: 'salt', type: 'uint256' }, - { name: 'extraData', type: 'bytes' }, - ], - }; - - const permissionData = { - account: userWalletAddress, - spender: spenderAddress, - token: USDC_CONTRACT_ADDRESS_BASE, - allowance: (config?.allowance ?? DEFAULT_ALLOWANCE).toString(), - period: period, - start: now, - end: end, - salt: BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)).toString(), - extraData: '0x', - }; - - // Sign the permission using wagmi wallet client - console.log('Requesting signature from wallet for address:', userWalletAddress); - const signature = await walletClient.signTypedData({ - account: userWalletAddress as `0x${string}`, - domain, - types, - primaryType: 'SpendPermission', - message: permissionData, - }); - - console.log(`Signed SpendPermission for ${userWalletAddress} with spender ${spenderAddress}`); - - return { - signature, - permission: { - ...permissionData, - allowance: permissionData.allowance.toString(), - period: permissionData.period, - start: permissionData.start, - end: permissionData.end, - salt: permissionData.salt.toString(), - }, - chainId: base.id, - createdAt: now, - }; - } - */ - private static async deploySmartWallet( smartWallet: EphemeralSmartWallet, - apiKey: string ): Promise { console.log('Deploying smart wallet to enable spend permissions...'); @@ -280,46 +128,11 @@ export class BaseAppAccount implements Account { console.log('✅ Smart wallet deployed successfully at:', smartWallet.address); } - /* - - constructor( - baseRPCUrl: string, - spendPermission: SpendPermission, - account: ViemAccount, - smartWallet: EphemeralSmartWallet, - logger?: Logger - ) { - if (!baseRPCUrl) { - throw new Error('Base RPC URL is required'); - } - if (!account) { - throw new Error('Account is required'); - } - if (!spendPermission) { - throw new Error('Spend permission is required'); - } - if (!smartWallet) { - throw new Error('Smart wallet required'); - } - - this.accountId = spendPermission.permission.spender; - - this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, account, smartWallet, logger), - } - }*/ - constructor( - baseRPCUrl: string, - //account: ViemAccount, - //walletClient: WalletClient, spendPermission: SpendPermission, ephemeralSmartWallet: EphemeralSmartWallet, logger?: Logger ) { - if (!baseRPCUrl) { - throw new Error('Base RPC URL is required'); - } if (!ephemeralSmartWallet) { throw new Error('Wallet client is required'); } @@ -327,15 +140,10 @@ export class BaseAppAccount implements Account { this.accountId = ephemeralSmartWallet.address; this.paymentMakers = { - 'base': new BaseAppPaymentMaker(baseRPCUrl, spendPermission, ephemeralSmartWallet, logger), + 'base': new BaseAppPaymentMaker(spendPermission, ephemeralSmartWallet, logger), } } - /** - * Clear all ATXP-related data from storage - * This includes spend permissions and any OAuth tokens - * @param storage Optional storage implementation (defaults to browser localStorage) - */ static clearAllStoredData(userWalletAddress: string, storage?: IStorage): void { if (typeof window === 'undefined' && !storage) { throw new Error('clearAllStoredData requires a storage to be provided outside of browser environments'); diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 6e51b3aa..690d5c15 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,10 +1,8 @@ import { USDC_CONTRACT_ADDRESS_BASE, type PaymentMaker } from '@atxp/client'; import { Logger, Currency, ConsoleLogger } from '@atxp/common'; -import { BigNumber } from 'bignumber.js'; -import { Address, parseEther, encodeFunctionData } from 'viem'; +import { Address, encodeFunctionData } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; -import { base } from 'viem/chains'; import { prepareSpendCallData } from '@base-org/account/spend-permission'; // Helper function to convert to base64url that works in both Node.js and browsers @@ -33,13 +31,6 @@ const ERC20_ABI = [ } ] as const; -/** - * Wait for a transaction to be confirmed with the specified number of confirmations - * @param smartWallet The smart wallet instance - * @param txHash The transaction hash to wait for - * @param confirmations Number of confirmations to wait for - * @param logger Logger instance for logging - */ async function waitForTransactionConfirmations( smartWallet: EphemeralSmartWallet, txHash: string, @@ -66,12 +57,10 @@ async function waitForTransactionConfirmations( export class BaseAppPaymentMaker implements PaymentMaker { private logger: Logger; - private baseRPCUrl: string; private spendPermission: SpendPermission; private smartWallet: EphemeralSmartWallet; constructor( - baseRPCUrl: string, spendPermission: SpendPermission, smartWallet: EphemeralSmartWallet, logger?: Logger @@ -82,7 +71,6 @@ export class BaseAppPaymentMaker implements PaymentMaker { if (!smartWallet) { throw new Error('Smart wallet is required'); } - this.baseRPCUrl = baseRPCUrl; this.logger = logger ?? new ConsoleLogger(); this.spendPermission = spendPermission; this.smartWallet = smartWallet; @@ -141,7 +129,7 @@ export class BaseAppPaymentMaker implements PaymentMaker { return encodedAuth; } - async makePayment(amount: BigNumber, currency: string, receiver: string, memo: string): Promise { + async makePayment(amount: BigNumber, currency: Currency, receiver: string, memo: string): Promise { if (currency !== 'USDC') { throw new Error('Only usdc currency is supported; received ' + currency); } diff --git a/packages/atxp-client/src/basePaymentMaker.ts b/packages/atxp-client/src/basePaymentMaker.ts index 8d550443..0b3456fb 100644 --- a/packages/atxp-client/src/basePaymentMaker.ts +++ b/packages/atxp-client/src/basePaymentMaker.ts @@ -4,18 +4,12 @@ import { Logger, Currency } from '@atxp/common'; import { ConsoleLogger } from '@atxp/common'; import { Address, - //createWalletClient, - //http, parseEther, publicActions, encodeFunctionData, WalletClient, PublicActions, - //Account, - //decodeAbiParameters, - //parseSignature, } from "viem"; -// import { privateKeyToAccount } from "viem/accounts"; import { base } from "viem/chains"; import { BigNumber } from "bignumber.js"; import { USDC_CONTRACT_ADDRESS_BASE } from './baseAccount.js'; @@ -68,7 +62,6 @@ const ERC20_ABI = [ export class BasePaymentMaker implements PaymentMaker { protected signingClient: ExtendedWalletClient; - //protected account: Account; protected logger: Logger; constructor(baseRPCUrl: string, walletClient: WalletClient, logger?: Logger) { @@ -83,16 +76,10 @@ export class BasePaymentMaker implements PaymentMaker { } this.signingClient = walletClient.extend(publicActions) as ExtendedWalletClient; - //this.publicClient = createWalletClient({ - //account: this.account, - //chain: base, - //transport: http(baseRPCUrl), - //}).extend(publicActions) as ExtendedWalletClient; this.logger = logger ?? new ConsoleLogger(); } async generateJWT({paymentRequestId, codeChallenge}: {paymentRequestId: string, codeChallenge: string}): Promise { - // Original JWT logic for regular wallets const headerObj = { alg: 'ES256K' }; const payloadObj = { From c00a562f8d5213d25f91076de0e3eb3787090c4e Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 10:05:38 -0700 Subject: [PATCH 47/53] More cleanup --- packages/atxp-base/src/baseAppAccount.ts | 13 ++----- packages/atxp-base/src/index.ts | 1 - packages/atxp-base/src/paymasterHelpers.ts | 34 ----------------- packages/atxp-base/src/smartWalletHelpers.ts | 39 +------------------- 4 files changed, 5 insertions(+), 82 deletions(-) delete mode 100644 packages/atxp-base/src/paymasterHelpers.ts diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 2323ba2c..5217bf39 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -12,6 +12,7 @@ import { requestSpendPermission } from "@base-org/account/spend-permission"; const DEFAULT_ALLOWANCE = 10n; const DEFAULT_PERIOD_IN_DAYS = 7; +const PAYMASTER_URL = 'https://api.developer.coinbase.com/rpc/v1/base/snPdXqIzOGhRkGNJvEHM5bl9Hm3yRO3m'; export class BaseAppAccount implements Account { accountId: string; @@ -56,7 +57,7 @@ export class BaseAppAccount implements Account { appName: config?.appName, appChainIds: [base.id], paymasterUrls: { - [base.id]: 'https://api.developer.coinbase.com/rpc/v1/base/snPdXqIzOGhRkGNJvEHM5bl9Hm3yRO3m', + [base.id]: PAYMASTER_URL } }); const provider = sdk.getProvider(); @@ -64,8 +65,9 @@ export class BaseAppAccount implements Account { const privateKey = generatePrivateKey(); const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); - console.log('Generated ephemeral wallet:', smartWallet.address); + logger.info(`Generated ephemeral wallet: ${smartWallet.address}`); await this.deploySmartWallet(smartWallet); + logger.info(`Deployed smart wallet: ${smartWallet.address}`); const permission = await requestSpendPermission({ account: config.userWalletAddress, @@ -77,8 +79,6 @@ export class BaseAppAccount implements Account { provider, }); - console.log('Permission:', permission); - // Save wallet and permission storage.set(storageKey, {privateKey, permission}); @@ -106,8 +106,6 @@ export class BaseAppAccount implements Account { private static async deploySmartWallet( smartWallet: EphemeralSmartWallet, ): Promise { - console.log('Deploying smart wallet to enable spend permissions...'); - const deployTx = await smartWallet.client.sendUserOperation({ calls: [{ to: smartWallet.address, @@ -124,8 +122,6 @@ export class BaseAppAccount implements Account { if (!receipt.success) { throw new Error(`Smart wallet deployment failed. Receipt: ${JSON.stringify(receipt)}`); } - - console.log('✅ Smart wallet deployed successfully at:', smartWallet.address); } constructor( @@ -151,6 +147,5 @@ export class BaseAppAccount implements Account { storage = storage || new BrowserStorage(); storage.delete(this.toStorageKey(userWalletAddress)); - console.log(`All ATXP-related data cleared from storage for ${userWalletAddress}`); } } \ No newline at end of file diff --git a/packages/atxp-base/src/index.ts b/packages/atxp-base/src/index.ts index 10cabec8..3c010df6 100644 --- a/packages/atxp-base/src/index.ts +++ b/packages/atxp-base/src/index.ts @@ -8,4 +8,3 @@ export { BrowserStorage, MemoryStorage } from './storage.js'; -export { validatePaymasterCapabilities } from './paymasterHelpers.js'; diff --git a/packages/atxp-base/src/paymasterHelpers.ts b/packages/atxp-base/src/paymasterHelpers.ts deleted file mode 100644 index 690d0a28..00000000 --- a/packages/atxp-base/src/paymasterHelpers.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { type WalletClient } from 'viem'; - -/** - * Validates that a wallet client supports paymaster functionality via EIP-5792 - * @param walletClient - The wallet client to validate - * @throws Error if the wallet client doesn't support required features - */ -export async function validatePaymasterCapabilities( - walletClient: WalletClient -): Promise { - if (!walletClient.account) { - throw new Error('Wallet client must have an account'); - } - - if (!('sendCalls' in walletClient)) { - throw new Error( - `WalletClient does not have sendCalls method (EIP-5792). ` + - `Available methods: ${Object.keys(walletClient).join(', ')}` - ); - } - - console.log('Validated EIP-5792 wallet with sendCalls support:', walletClient.account.address); - - // Check wallet capabilities for debugging - if ('getCapabilities' in walletClient) { - try { - const capabilities = await walletClient.getCapabilities(); - console.log('Wallet capabilities:', capabilities); - } catch (error) { - console.log('Error getting capabilities:', error); - } - } -} - diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index 41233be2..7e00eaeb 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -3,14 +3,12 @@ import { createPublicClient, type Account, type Address, - type LocalAccount, } from 'viem'; import { base } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; import { toCoinbaseSmartAccount, createBundlerClient, - createPaymasterClient, type BundlerClient, type SmartAccount } from 'viem/account-abstraction'; @@ -65,39 +63,4 @@ export async function toEphemeralSmartWallet( account, signer, }; -} - -// /** -// * Gets the counterfactual address for a smart wallet without deploying it -// */ -// /*export async function getSmartWalletAddress( -// signerOrPrivateKey: Address | `0x${string}`, -// apiKey: string -// ): Promise
{ -// const publicClient = createPublicClient({ -// chain: base, -// transport: http(`${COINBASE_BUNDLER_URL}/${apiKey}`) -// }); -// -// // Check if we received a private key or just an address -// let owner: LocalAccount; -// if (signerOrPrivateKey.length === 66) { -// // It's a private key -// owner = privateKeyToAccount(signerOrPrivateKey as `0x${string}`); -// } else { -// // It's just an address - we need to return a placeholder -// // since we can't create a valid account without a private key -// // This is a limitation of the current Coinbase Smart Wallet implementation -// console.warn('Cannot compute exact smart wallet address without private key. Using placeholder.'); -// // Return a deterministic but placeholder address -// return `0x${'0'.repeat(38)}${signerOrPrivateKey.slice(-2)}` as Address; -// } -// -// const smartAccount = await toCoinbaseSmartAccount({ -// client: publicClient, -// owners: [owner], -// version: '1' -// }); -// -// return smartAccount.address; -// }*/ \ No newline at end of file +} \ No newline at end of file From d2dd3400ece5726b6beaa64af31f3a79301741ff Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 10:21:20 -0700 Subject: [PATCH 48/53] Remove atxp-base readme and unnecessary vitest.config.ts --- packages/atxp-base/README.md | 65 --------------------------- packages/atxp-base/vitest.config.ts | 8 ---- packages/atxp-common/vitest.config.ts | 9 ---- packages/atxp-server/vitest.config.ts | 8 ---- 4 files changed, 90 deletions(-) delete mode 100644 packages/atxp-base/README.md delete mode 100644 packages/atxp-base/vitest.config.ts delete mode 100644 packages/atxp-common/vitest.config.ts delete mode 100644 packages/atxp-server/vitest.config.ts diff --git a/packages/atxp-base/README.md b/packages/atxp-base/README.md deleted file mode 100644 index f700fb21..00000000 --- a/packages/atxp-base/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# @atxp/base - -For use within [Base Mini Apps](https://docs.base.org/mini-apps/overview) - -## Example - -``` -// Import the ATXP client SDK -import { atxpClient } from '@atxp/client'; -import { BaseAppAccount } from '@atxp/base'; -import { getCryptoKeyAccount } from "@base-org/account"; - -// (rate limited, use a different node in production) -const BASE_RPC_URL = 'https://mainnet.base.org'; - -// IMPORTANT: -// all of the following code requires the user to -// have connected their Base wallet to the app - -const account = await getCryptoKeyAccount(); -const userWalletAddress = account.account?.address -if (!userWalletAddress) { - throw new Error("No user wallet address found—please ensure that the user's wallet is connected"); -} - -// this will prompt the user for a spend permission if -// none is found in local storage -const baseAppAccount = await BaseAppAccount.initialize( - BASE_RPC_URL, - userWalletAddress, - // optional config - { - appName: 'My Mini App', // displayed to the user when requesting spend permission - allowance: 10n, // requesting 10 USDC for each period - periodInDays: 7, // periods renew every 7 days - // storage: customStorage, // optional: provide custom storage implementation (defaults to localStorage) - } -); - -// Now you can create an ATXP client which -// pulls funds from the user's wallet as needed -const client = await atxpClient({ - mcpServer: browseService.mcpServer, - account: baseAppAccount, -}); -``` - -## Testing - -For unit tests, you can use the `MemoryStorage` implementation to avoid dependencies on browser APIs: - -```typescript -import { BaseAppAccount } from '@atxp/base'; -import { MemoryStorage } from '@atxp/base'; - -const testStorage = new MemoryStorage(); -const baseAppAccount = await BaseAppAccount.initialize( - BASE_RPC_URL, - userWalletAddress, - { - appName: 'Test App', - storage: testStorage, // Use in-memory storage for tests - } -); -``` \ No newline at end of file diff --git a/packages/atxp-base/vitest.config.ts b/packages/atxp-base/vitest.config.ts deleted file mode 100644 index 45c0cf32..00000000 --- a/packages/atxp-base/vitest.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - environment: 'node', - globals: true, - }, -}); \ No newline at end of file diff --git a/packages/atxp-common/vitest.config.ts b/packages/atxp-common/vitest.config.ts deleted file mode 100644 index 7a45f2d2..00000000 --- a/packages/atxp-common/vitest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - environment: 'node', // Use Node environment for crypto APIs - globals: true, - // Minimal setup for Node environment - }, -}); \ No newline at end of file diff --git a/packages/atxp-server/vitest.config.ts b/packages/atxp-server/vitest.config.ts deleted file mode 100644 index 45c0cf32..00000000 --- a/packages/atxp-server/vitest.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { - environment: 'node', - globals: true, - }, -}); \ No newline at end of file From b4007cba708cf5b021fb237d42a01bc1896f7e40 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 10:25:32 -0700 Subject: [PATCH 49/53] Lint --- packages/atxp-base/src/baseAppPaymentMaker.ts | 2 ++ .../atxp-client/src/basePaymentMaker.insufficientFunds.test.ts | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 690d5c15..2a41722e 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -41,6 +41,7 @@ async function waitForTransactionConfirmations( const publicClient = smartWallet.client.account?.client; if (publicClient && 'waitForTransactionReceipt' in publicClient) { logger.info(`Waiting for ${confirmations} confirmations...`); + // eslint-disable-next-line @typescript-eslint/no-explicit-any await (publicClient as any).waitForTransactionReceipt({ hash: txHash, confirmations: confirmations @@ -129,6 +130,7 @@ export class BaseAppPaymentMaker implements PaymentMaker { return encodedAuth; } + // eslint-disable-next-line @typescript-eslint/no-unused-vars async makePayment(amount: BigNumber, currency: Currency, receiver: string, memo: string): Promise { if (currency !== 'USDC') { throw new Error('Only usdc currency is supported; received ' + currency); diff --git a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts index bb22902b..56f2c2af 100644 --- a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts +++ b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts @@ -2,9 +2,6 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { BasePaymentMaker } from './basePaymentMaker.js'; import { InsufficientFundsError, PaymentNetworkError } from './types.js'; import { BigNumber } from 'bignumber.js'; -import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; -import { createWalletClient, http } from 'viem'; -import { base } from 'viem/chains'; import { USDC_CONTRACT_ADDRESS_BASE } from './baseAccount.js'; // Mock viem functions From da67e723a1b1e6345edb7956da4be759ca893406 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 10:44:50 -0700 Subject: [PATCH 50/53] Lint; tests --- packages/atxp-base/src/baseAppAccount.ts | 8 +- .../atxp-base/src/baseAppPaymentMaker.test.ts | 85 +++++++++++++++---- packages/atxp-base/tsconfig.json | 2 +- ...basePaymentMaker.insufficientFunds.test.ts | 7 +- .../src/defaultPaymentFailureHandler.test.ts | 16 ++-- packages/atxp-client/src/errorClasses.test.ts | 8 +- ...lanaPaymentMaker.insufficientFunds.test.ts | 37 ++++---- .../src/platform/platform.simple.test.ts | 2 +- 8 files changed, 115 insertions(+), 50 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 5217bf39..f630c8ab 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -23,9 +23,9 @@ export class BaseAppAccount implements Account { } static async initialize(config: { - userWalletAddress: string, - appName: string; + walletAddress: string, apiKey: string; + appName: string; allowance?: bigint; periodInDays?: number; storage?: IStorage; @@ -44,7 +44,7 @@ export class BaseAppAccount implements Account { // Initialize storage const baseStorage = config?.storage || new BrowserStorage(); const storage = new IntermediaryStorage(baseStorage); - const storageKey = this.toStorageKey(config.userWalletAddress); + const storageKey = this.toStorageKey(config.walletAddress); // Try to load existing permission const existingData = this.loadSavedWalletAndPermission(storage, storageKey); @@ -70,7 +70,7 @@ export class BaseAppAccount implements Account { logger.info(`Deployed smart wallet: ${smartWallet.address}`); const permission = await requestSpendPermission({ - account: config.userWalletAddress, + account: config.walletAddress, spender: smartWallet.address, token: USDC_CONTRACT_ADDRESS_BASE, chainId: base.id, diff --git a/packages/atxp-base/src/baseAppPaymentMaker.test.ts b/packages/atxp-base/src/baseAppPaymentMaker.test.ts index 1ff664d6..959b69ae 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.test.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.test.ts @@ -1,20 +1,47 @@ import { describe, it, expect } from 'vitest'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; -import { createWalletClient, http } from 'viem'; -import { base } from 'viem/chains'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; -// import { SpendPermission } from './types.js'; +import type { SpendPermission } from './types.js'; +import type { EphemeralSmartWallet } from './smartWalletHelpers.js'; describe('basePaymentMaker.generateJWT', () => { it('should generate EIP-1271 auth data with default payload', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const walletClient = createWalletClient({ - account, - chain: base, - transport: http('https://example.com') - }); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', walletClient); + + // Create mock SpendPermission + const mockSpendPermission: SpendPermission = { + signature: '0xmocksignature', + permission: { + account: account.address, + spender: '0xspender', + token: '0xtoken', + allowance: '1000000', + period: 86400, + start: Math.floor(Date.now() / 1000), + end: Math.floor(Date.now() / 1000) + 86400, + salt: '1', + extraData: '0x' + } + }; + + // Create mock EphemeralSmartWallet + const mockSmartWallet: EphemeralSmartWallet = { + address: account.address, + account: { + address: account.address, + signMessage: async (_message: any) => '0xmocksignature' + }, + signer: { + address: account.address, + signMessage: async (_message: any) => '0xmocksignature', + signTypedData: async (_params: any) => '0xmocksignature', + signTransaction: async (_tx: any) => '0xmocksignature', + getAddress: async () => account.address + } + } as any; + + const paymentMaker = new BaseAppPaymentMaker(mockSpendPermission, mockSmartWallet); const authData = await paymentMaker.generateJWT({paymentRequestId: '', codeChallenge: 'testCodeChallenge'}); // Should return base64-encoded EIP-1271 auth data @@ -37,12 +64,40 @@ describe('basePaymentMaker.generateJWT', () => { it('should include payment request id if provided', async () => { const privateKey = generatePrivateKey(); const account = privateKeyToAccount(privateKey); - const walletClient = createWalletClient({ - account, - chain: base, - transport: http('https://example.com') - }); - const paymentMaker = new BaseAppPaymentMaker('https://example.com', walletClient); + + // Create mock SpendPermission + const mockSpendPermission: SpendPermission = { + signature: '0xmocksignature', + permission: { + account: account.address, + spender: '0xspender', + token: '0xtoken', + allowance: '1000000', + period: 86400, + start: Math.floor(Date.now() / 1000), + end: Math.floor(Date.now() / 1000) + 86400, + salt: '1', + extraData: '0x' + } + }; + + // Create mock EphemeralSmartWallet + const mockSmartWallet: EphemeralSmartWallet = { + address: account.address, + account: { + address: account.address, + signMessage: async (_message: any) => '0xmocksignature' + }, + signer: { + address: account.address, + signMessage: async (_message: any) => '0xmocksignature', + signTypedData: async (_params: any) => '0xmocksignature', + signTransaction: async (_tx: any) => '0xmocksignature', + getAddress: async () => account.address + } + } as any; + + const paymentMaker = new BaseAppPaymentMaker(mockSpendPermission, mockSmartWallet); const paymentRequestId = 'id1'; const authData = await paymentMaker.generateJWT({paymentRequestId, codeChallenge: ''}); diff --git a/packages/atxp-base/tsconfig.json b/packages/atxp-base/tsconfig.json index e1cab11e..2e411395 100644 --- a/packages/atxp-base/tsconfig.json +++ b/packages/atxp-base/tsconfig.json @@ -18,7 +18,7 @@ "composite": true }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "dist", "**/*.test.ts"], + "exclude": ["node_modules", "dist"], "references": [ { "path": "../atxp-common" }, { "path": "../atxp-client" } diff --git a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts index 56f2c2af..899d34f8 100644 --- a/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts +++ b/packages/atxp-client/src/basePaymentMaker.insufficientFunds.test.ts @@ -37,6 +37,9 @@ vi.mock('viem/chains', () => ({ })); interface MockSigningClient { + account: { + address: string; + }; signMessage: ReturnType; sendTransaction: ReturnType; waitForTransactionReceipt: ReturnType; @@ -140,11 +143,11 @@ describe('BasePaymentMaker insufficient funds handling', () => { it('should throw PaymentNetworkError for unsupported currency', async () => { await expect( - paymentMaker.makePayment(new BigNumber('10'), 'ETH', '0xreceiver') + paymentMaker.makePayment(new BigNumber('10'), 'ETH' as any, '0xreceiver') ).rejects.toThrow(PaymentNetworkError); try { - await paymentMaker.makePayment(new BigNumber('10'), 'ETH', '0xreceiver'); + await paymentMaker.makePayment(new BigNumber('10'), 'ETH' as any, '0xreceiver'); } catch (error) { expect(error).toBeInstanceOf(PaymentNetworkError); diff --git a/packages/atxp-client/src/defaultPaymentFailureHandler.test.ts b/packages/atxp-client/src/defaultPaymentFailureHandler.test.ts index 2b911f26..baf4896d 100644 --- a/packages/atxp-client/src/defaultPaymentFailureHandler.test.ts +++ b/packages/atxp-client/src/defaultPaymentFailureHandler.test.ts @@ -113,14 +113,14 @@ describe('Default Payment Failure Handler', () => { it('should handle different currencies and amounts', async () => { const payment = createTestPayment({ - network: 'ethereum', - currency: 'ETH', + network: 'ethereum' as any, + currency: 'ETH' as any, amount: new BigNumber('2.5'), accountId: 'trader-123', }); const error = new InsufficientFundsError( - 'ETH', + 'ETH' as any, new BigNumber('2.5'), new BigNumber('0.001'), 'ethereum' @@ -166,7 +166,7 @@ describe('Default Payment Failure Handler', () => { it('should handle network error with different networks', async () => { const payment = createTestPayment({ - network: 'polygon', + network: 'polygon' as any, }); const error = new PaymentNetworkError('Transaction reverted'); @@ -274,11 +274,11 @@ describe('Default Payment Failure Handler', () => { it('should handle small decimal amounts correctly', async () => { const payment = createTestPayment({ amount: new BigNumber('0.000001'), - currency: 'BTC', + currency: 'USDC' as const, }); const error = new InsufficientFundsError( - 'BTC', + 'USDC' as const, new BigNumber('0.000001'), new BigNumber('0.0000005'), 'bitcoin' @@ -286,8 +286,8 @@ describe('Default Payment Failure Handler', () => { await defaultHandler({ payment, error }); - expect(mockLogger.info).toHaveBeenCalledWith('Required: 0.000001 BTC'); - expect(mockLogger.info).toHaveBeenCalledWith('Available: 5e-7 BTC'); + expect(mockLogger.info).toHaveBeenCalledWith('Required: 0.000001 USDC'); + expect(mockLogger.info).toHaveBeenCalledWith('Available: 5e-7 USDC'); }); it('should handle large amounts correctly', async () => { diff --git a/packages/atxp-client/src/errorClasses.test.ts b/packages/atxp-client/src/errorClasses.test.ts index ea53fe2f..8e34a3d2 100644 --- a/packages/atxp-client/src/errorClasses.test.ts +++ b/packages/atxp-client/src/errorClasses.test.ts @@ -37,25 +37,25 @@ describe('InsufficientFundsError', () => { it('should work without network', () => { const error = new InsufficientFundsError( - 'ETH', + 'USDC' as const, new BigNumber('1.5'), new BigNumber('0.8') ); expect(error.message).toBe( - 'Payment failed due to insufficient ETH funds. Required: 1.5, Available: 0.8. Please ensure your account has adequate balance before retrying.' + 'Payment failed due to insufficient USDC funds. Required: 1.5, Available: 0.8. Please ensure your account has adequate balance before retrying.' ); expect(error.network).toBeUndefined(); }); it('should work with minimal parameters', () => { const error = new InsufficientFundsError( - 'BTC', + 'USDC' as const, new BigNumber('0.001') ); expect(error.message).toBe( - 'Payment failed due to insufficient BTC funds. Required: 0.001. Please ensure your account has adequate balance before retrying.' + 'Payment failed due to insufficient USDC funds. Required: 0.001. Please ensure your account has adequate balance before retrying.' ); expect(error.available).toBeUndefined(); expect(error.network).toBeUndefined(); diff --git a/packages/atxp-client/src/solanaPaymentMaker.insufficientFunds.test.ts b/packages/atxp-client/src/solanaPaymentMaker.insufficientFunds.test.ts index 9596507c..a66b8784 100644 --- a/packages/atxp-client/src/solanaPaymentMaker.insufficientFunds.test.ts +++ b/packages/atxp-client/src/solanaPaymentMaker.insufficientFunds.test.ts @@ -63,6 +63,12 @@ describe('SolanaPaymentMaker insufficient funds handling', () => { mockConnection = { // Mock connection methods + getTokenAccountBalance: vi.fn(), + sendTransaction: vi.fn().mockResolvedValue('TransactionSignature123'), + getLatestBlockhash: vi.fn().mockResolvedValue({ + blockhash: 'mockedBlockhash', + lastValidBlockHeight: 100 + }) }; paymentMaker = new SolanaPaymentMaker( @@ -137,23 +143,24 @@ describe('SolanaPaymentMaker insufficient funds handling', () => { expect(sendAndConfirmTransaction).toHaveBeenCalled(); }); - it('should throw PaymentNetworkError for unsupported currency', async () => { - await expect( - paymentMaker.makePayment(new BigNumber('10'), 'SOL', 'ReceiverPublicKey') - ).rejects.toThrow(PaymentNetworkError); - - try { - await paymentMaker.makePayment(new BigNumber('10'), 'SOL', 'ReceiverPublicKey'); - } catch (error) { - expect(error).toBeInstanceOf(PaymentNetworkError); - - if (error instanceof PaymentNetworkError) { - expect(error.message).toContain('Only USDC currency is supported'); + it('should successfully process USDC payments', async () => { + // Mock sufficient balance for USDC + vi.mocked(getAssociatedTokenAddress).mockResolvedValue('AssociatedTokenAddress' as any); + vi.mocked(sendAndConfirmTransaction).mockResolvedValue('TransactionSignature123'); + mockConnection.getTokenAccountBalance.mockResolvedValue({ + value: { + amount: '15000000', // 15 USDC (6 decimals) + decimals: 6, + uiAmount: 15, + uiAmountString: '15' } - } + }); + + const result = await paymentMaker.makePayment(new BigNumber('10'), 'USDC', 'ReceiverPublicKey'); - // Verify balance check was not attempted - expect(getAssociatedTokenAddress).not.toHaveBeenCalled(); + expect(result).toBe('TransactionSignature123'); + expect(getAssociatedTokenAddress).toHaveBeenCalled(); + expect(sendAndConfirmTransaction).toHaveBeenCalled(); }); it('should wrap unexpected errors in PaymentNetworkError', async () => { diff --git a/packages/atxp-common/src/platform/platform.simple.test.ts b/packages/atxp-common/src/platform/platform.simple.test.ts index 6cd483a6..244ea400 100644 --- a/packages/atxp-common/src/platform/platform.simple.test.ts +++ b/packages/atxp-common/src/platform/platform.simple.test.ts @@ -40,7 +40,7 @@ describe('Platform Detection Logic', () => { expect(uuid.length).toBeGreaterThan(30); // UUIDs are typically 36 chars } catch (error) { // Expected in vitest ESM environment - the fix works in actual runtime - expect(error.message).toContain('synchronous module loading'); + expect((error as Error).message).toContain('synchronous module loading'); } }); From a71be980b24f6653d1286c12eff6c6b2f5bbc534 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 11:05:50 -0700 Subject: [PATCH 51/53] Don't recreate provider --- packages/atxp-base/src/baseAppAccount.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index f630c8ab..68c4b3bf 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -61,7 +61,7 @@ export class BaseAppAccount implements Account { } }); const provider = sdk.getProvider(); - await sdk.getProvider().request({ method: 'wallet_connect' }); + await provider.request({ method: 'wallet_connect' }); const privateKey = generatePrivateKey(); const smartWallet = await toEphemeralSmartWallet(privateKey, config.apiKey); From 2ee8162f15f83853867ee1b24c8a6b9abeb5bab6 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 11:58:07 -0700 Subject: [PATCH 52/53] Use Hex type instead of --- packages/atxp-base/src/baseAppAccount.ts | 3 ++- packages/atxp-base/src/baseAppPaymentMaker.ts | 10 +++++----- packages/atxp-base/src/smartWalletHelpers.ts | 3 ++- packages/atxp-base/src/storage.ts | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/atxp-base/src/baseAppAccount.ts b/packages/atxp-base/src/baseAppAccount.ts index 68c4b3bf..009598e1 100644 --- a/packages/atxp-base/src/baseAppAccount.ts +++ b/packages/atxp-base/src/baseAppAccount.ts @@ -3,6 +3,7 @@ import { USDC_CONTRACT_ADDRESS_BASE } from '@atxp/client'; import { BaseAppPaymentMaker } from './baseAppPaymentMaker.js'; import { generatePrivateKey } from 'viem/accounts'; import { base } from 'viem/chains'; +import { Hex } from '@atxp/client'; import { SpendPermission } from './types.js'; import { IStorage, BrowserStorage, IntermediaryStorage, type Intermediary } from './storage.js'; import { toEphemeralSmartWallet, type EphemeralSmartWallet } from './smartWalletHelpers.js'; @@ -110,7 +111,7 @@ export class BaseAppAccount implements Account { calls: [{ to: smartWallet.address, value: 0n, - data: '0x' as `0x${string}` + data: '0x' as Hex }], paymaster: true }); diff --git a/packages/atxp-base/src/baseAppPaymentMaker.ts b/packages/atxp-base/src/baseAppPaymentMaker.ts index 2a41722e..5eab1995 100644 --- a/packages/atxp-base/src/baseAppPaymentMaker.ts +++ b/packages/atxp-base/src/baseAppPaymentMaker.ts @@ -1,6 +1,6 @@ import { USDC_CONTRACT_ADDRESS_BASE, type PaymentMaker } from '@atxp/client'; import { Logger, Currency, ConsoleLogger } from '@atxp/common'; -import { Address, encodeFunctionData } from 'viem'; +import { Address, encodeFunctionData, Hex } from 'viem'; import { SpendPermission } from './types.js'; import { type EphemeralSmartWallet } from './smartWalletHelpers.js'; import { prepareSpendCallData } from '@base-org/account/spend-permission'; @@ -144,13 +144,13 @@ export class BaseAppPaymentMaker implements PaymentMaker { // Add a second call to transfer USDC from the smart wallet to the receiver const transferCall = { - to: USDC_CONTRACT_ADDRESS_BASE as `0x${string}`, + to: USDC_CONTRACT_ADDRESS_BASE as Hex, data: encodeFunctionData({ abi: ERC20_ABI, functionName: "transfer", args: [receiver as Address, amountInUSDCUnits], }), - value: '0x0' as `0x${string}` + value: '0x0' as Hex }; // Combine spend permission calls with the transfer call @@ -161,8 +161,8 @@ export class BaseAppPaymentMaker implements PaymentMaker { account: this.smartWallet.account, calls: allCalls.map(call => { return { - to: call.to as `0x${string}`, - data: call.data as `0x${string}`, + to: call.to as Hex, + data: call.data as Hex, value: BigInt(call.value || '0x0') } }) diff --git a/packages/atxp-base/src/smartWalletHelpers.ts b/packages/atxp-base/src/smartWalletHelpers.ts index 7e00eaeb..8d14167b 100644 --- a/packages/atxp-base/src/smartWalletHelpers.ts +++ b/packages/atxp-base/src/smartWalletHelpers.ts @@ -3,6 +3,7 @@ import { createPublicClient, type Account, type Address, + type Hex, } from 'viem'; import { base } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; @@ -28,7 +29,7 @@ export interface EphemeralSmartWallet { * Creates an ephemeral smart wallet with paymaster support */ export async function toEphemeralSmartWallet( - privateKey: `0x${string}`, + privateKey: Hex, apiKey: string ): Promise { const signer = privateKeyToAccount(privateKey); diff --git a/packages/atxp-base/src/storage.ts b/packages/atxp-base/src/storage.ts index 88cd99bd..d63924b0 100644 --- a/packages/atxp-base/src/storage.ts +++ b/packages/atxp-base/src/storage.ts @@ -1,11 +1,12 @@ import { SpendPermission } from './types.js'; +import { Hex } from '@atxp/client'; /** * Stored permission data structure */ export interface Intermediary { /** Ephemeral wallet private key */ - privateKey: `0x${string}`; + privateKey: Hex; /** Spend permission from Base */ permission: SpendPermission; } From 564b1f11969692682927231dfe57b66670dee493 Mon Sep 17 00:00:00 2001 From: bdj Date: Tue, 26 Aug 2025 12:15:55 -0700 Subject: [PATCH 53/53] Attempt to fix CI issues --- .github/workflows/test.yml | 11 ++++- package-lock.json | 88 +++++++++++++++++++++++++++++++++++++- package.json | 9 ++++ 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ea541946..5bfcafc9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: registry-url: 'https://registry.npmjs.org' # Added this line - name: Install dependencies with rollup workaround - run: npm ci + run: npm ci --include=optional continue-on-error: true id: npm-ci env: @@ -45,7 +45,7 @@ jobs: echo "npm ci failed, applying rollup optional dependency workaround..." npm cache clean --force rm -rf node_modules package-lock.json - npm install + npm install --include=optional env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} @@ -58,6 +58,13 @@ jobs: - name: Run lint run: npm run lint + - name: Verify Rollup installation + run: | + echo "Checking for Rollup platform binaries..." + ls -la node_modules/@rollup/ | grep rollup- || echo "No @rollup packages found in root" + echo "Checking Rollup version..." + npm ls rollup || true + - name: Run tests run: npm test diff --git a/package-lock.json b/package-lock.json index 4cc3f4ee..bdec290d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,15 @@ "tsx": "^4.19.2", "typescript": "^5.7.3", "vitest": "^3.0.9" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2" } }, "node_modules/@0no-co/graphql.web": { @@ -4069,13 +4078,90 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "dev": true, diff --git a/package.json b/package.json index 3e7786e8..f6e1919d 100644 --- a/package.json +++ b/package.json @@ -54,5 +54,14 @@ "tsx": "^4.19.2", "typescript": "^5.7.3", "vitest": "^3.0.9" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2" } }