diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a634bd2..dad8fb5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,11 +21,9 @@ jobs: with: node-version: '20' cache: 'npm' - cache-dependency-path: frontend/package-lock.json - name: Install dependencies - run: npm ci - working-directory: frontend + run: npm ci --include=optional - name: Lint run: npm run lint @@ -62,11 +60,9 @@ jobs: with: node-version: '20' cache: 'npm' - cache-dependency-path: backend/package-lock.json - name: Install dependencies - run: npm ci - working-directory: backend + run: npm ci --include=optional - name: Generate Prisma Client run: npx prisma generate diff --git a/backend/docs/AUTHENTICATION.md b/backend/docs/AUTHENTICATION.md new file mode 100644 index 0000000..0f9e72d --- /dev/null +++ b/backend/docs/AUTHENTICATION.md @@ -0,0 +1,218 @@ +# Authentication Middleware (SEP-10) + +FlowFi API uses Stellar signed transactions for authentication, following the SEP-10 (Stellar Web Authentication) pattern. + +## Overview + +The authentication middleware verifies that requests come from legitimate Stellar wallet owners by validating signed transactions. This provides secure, wallet-based authentication without traditional username/password schemes. + +## How It Works + +1. **Client Side**: The client creates a Stellar transaction, signs it with their private key, and encodes it as XDR +2. **Server Side**: The middleware extracts the Bearer token, decodes the XDR, and verifies the signature +3. **User Attachment**: If valid, the user's public key is attached to `req.user` + +## Using the Middleware + +### Protected Routes + +Apply `authMiddleware` to any route that requires authentication: + +```typescript +import { authMiddleware } from '../middleware/auth.middleware.js'; +import { Router } from 'express'; + +const router = Router(); + +// Protected endpoint +router.get('/me', authMiddleware, getCurrentUser); +``` + +### Optional Authentication + +Use `optionalAuthMiddleware` for routes where authentication is optional: + +```typescript +import { optionalAuthMiddleware } from '../middleware/auth.middleware.js'; + +router.get('/streams', optionalAuthMiddleware, getStreams); +``` + +## Request Format + +### Authorization Header + +``` +Authorization: Bearer +``` + +### Example + +```bash +curl -X GET http://localhost:3001/v1/users/me \ + -H "Authorization: Bearer AAAAAgAAAAC..." +``` + +## Transaction Requirements + +The signed transaction must meet these requirements: + +1. **Source Account**: Must be the user's Stellar public key +2. **Valid Signature**: Signature must be valid for the source account +3. **Time Bounds** (optional but recommended): Transaction should include time bounds to prevent replay attacks +4. **Network**: Must match the configured Stellar network (testnet or mainnet) + +## Example: Creating a Signed Transaction (Client Side) + +```javascript +import * as StellarSdk from '@stellar/stellar-sdk'; + +// Create a keypair (in real app, this comes from the user's wallet) +const keypair = StellarSdk.Keypair.fromSecret('S...'); + +// Get the current network passphrase +const networkPassphrase = StellarSdk.Networks.TESTNET; + +// Create a simple transaction for authentication +const account = await server.loadAccount(keypair.publicKey()); +const transaction = new StellarSdk.TransactionBuilder(account, { + fee: StellarSdk.BASE_FEE, + networkPassphrase, +}) + .addOperation( + StellarSdk.Operation.manageData({ + name: 'auth', + value: crypto.randomBytes(32), // Random challenge + }) + ) + .setTimeout(300) // 5 minutes validity + .build(); + +// Sign the transaction +transaction.sign(keypair); + +// Encode to XDR for the Bearer token +const xdr = transaction.toEnvelope().toXDR('base64'); + +// Use in Authorization header +const response = await fetch('http://localhost:3001/v1/users/me', { + headers: { + 'Authorization': `Bearer ${xdr}` + } +}); +``` + +## Error Responses + +### 401 Unauthorized - Missing Token + +```json +{ + "error": "Unauthorized", + "message": "Missing or invalid Authorization header. Expected format: Bearer " +} +``` + +### 401 Unauthorized - Invalid Signature + +```json +{ + "error": "Unauthorized", + "message": "Invalid or expired signature" +} +``` + +## Security Features + +1. **Signature Verification**: Cryptographically verifies the transaction was signed by the claimed public key +2. **Time Bounds**: Supports transaction time bounds to prevent replay attacks +3. **Network Validation**: Ensures transactions match the configured Stellar network +4. **No Password Storage**: No sensitive credentials stored on the server + +## Configuration + +### Environment Variables + +```env +# Stellar Network (testnet or mainnet) +STELLAR_NETWORK=testnet + +# For mainnet, use: +# STELLAR_NETWORK=mainnet +``` + +### Network Passphrases + +- **Testnet**: `Test SDF Network ; September 2015` +- **Mainnet**: `Public Global Stellar Network ; September 2015` + +## Independence from Database + +Per issue #74 requirements, the middleware operates independently of the database: + +- **User Exists**: Returns user data from database +- **User Missing**: Returns in-memory user object with `publicKey` and empty arrays +- **Never Blocks**: Authentication succeeds based solely on valid signature + +Example in-memory response: + +```json +{ + "publicKey": "GABC123...", + "sentStreams": [], + "receivedStreams": [], + "inMemory": true +} +``` + +## TypeScript Types + +### AuthUser + +```typescript +interface AuthUser { + publicKey: string; + id?: string; +} +``` + +### AuthenticatedRequest + +```typescript +interface AuthenticatedRequest extends Request { + user: AuthUser; +} +``` + +### Usage in Controllers + +```typescript +import type { AuthenticatedRequest } from '../types/auth.types.js'; + +export const getCurrentUser = async (req: Request, res: Response) => { + const authReq = req as AuthenticatedRequest; + const { publicKey } = authReq.user; + + // Use publicKey... +}; +``` + +## Testing + +Test the middleware with a valid signed transaction: + +```bash +# 1. Create a test transaction (use stellar-sdk) +# 2. Sign it with a test keypair +# 3. Encode to XDR +# 4. Send request + +curl -X GET http://localhost:3001/v1/users/me \ + -H "Authorization: Bearer " +``` + +## Related Documentation + +- [Stellar SEP-10 Specification](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0010.md) +- [Stellar SDK Documentation](https://stellar.github.io/js-stellar-sdk/) +- [Swagger API Docs](http://localhost:3001/api-docs) diff --git a/backend/package.json b/backend/package.json index fa15e8b..2a0874d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -23,12 +23,13 @@ "license": "ISC", "dependencies": { "@prisma/adapter-pg": "^7.4.1", - "@stellar/stellar-sdk": "^13.1.0", + "@stellar/stellar-sdk": "^14.5.0", "cors": "^2.8.6", "dotenv": "^17.3.1", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "pg": "^8.18.0", + "stellar-sdk": "^13.3.0", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", "winston": "^3.11.0", diff --git a/backend/src/config/sandbox.ts b/backend/src/config/sandbox.ts index 263e21f..b190399 100644 --- a/backend/src/config/sandbox.ts +++ b/backend/src/config/sandbox.ts @@ -20,15 +20,20 @@ export interface SandboxConfig { export function getSandboxConfig(): SandboxConfig { const enabled = process.env.SANDBOX_MODE_ENABLED === 'true'; const databaseUrl = process.env.SANDBOX_DATABASE_URL; - - return { + + const config: SandboxConfig = { enabled, - databaseUrl: databaseUrl || undefined, allowHeader: process.env.SANDBOX_ALLOW_HEADER !== 'false', // Default: true allowQueryParam: process.env.SANDBOX_ALLOW_QUERY_PARAM !== 'false', // Default: true headerName: process.env.SANDBOX_HEADER_NAME || 'X-Sandbox-Mode', queryParamName: process.env.SANDBOX_QUERY_PARAM_NAME || 'sandbox', }; + + if (databaseUrl) { + config.databaseUrl = databaseUrl; + } + + return config; } /** diff --git a/backend/src/config/swagger.ts b/backend/src/config/swagger.ts index e8b311b..cca0fb3 100644 --- a/backend/src/config/swagger.ts +++ b/backend/src/config/swagger.ts @@ -61,6 +61,14 @@ See [Sandbox Mode Documentation](../docs/SANDBOX_MODE.md) for details.`, }, ], components: { + securitySchemes: { + BearerAuth: { + type: 'http', + scheme: 'bearer', + bearerFormat: 'Stellar Signed Transaction (XDR)', + description: 'Stellar SEP-10 authentication. Provide a signed transaction envelope in XDR format.' + } + }, schemas: { User: { type: 'object', diff --git a/backend/src/controllers/user.controller.ts b/backend/src/controllers/user.controller.ts index b6f2dcc..3cb1910 100644 --- a/backend/src/controllers/user.controller.ts +++ b/backend/src/controllers/user.controller.ts @@ -2,6 +2,7 @@ import type { Request, Response, NextFunction } from 'express'; import { prisma } from '../lib/prisma.js'; import logger from '../logger.js'; import { registerUserSchema } from '../validators/user.validator.js'; +import type { AuthenticatedRequest } from '../types/auth.types.js'; /** * Register a new wallet public key @@ -37,7 +38,7 @@ export const registerUser = async (req: Request, res: Response, next: NextFuncti */ export const getUser = async (req: Request, res: Response, next: NextFunction) => { try { - const { publicKey } = req.params; + const publicKey = req.params.publicKey as string; const user = await prisma.user.findUnique({ where: { publicKey }, @@ -90,3 +91,44 @@ export const getUserEvents = async (req: Request, res: Response, next: NextFunct next(error); } }; + +/** + * Get current authenticated user + * Requires authMiddleware to be applied + */ +export const getCurrentUser = async (req: Request, res: Response, next: NextFunction) => { + try { + const authReq = req as AuthenticatedRequest; + const { publicKey } = authReq.user; + + // Try to get user from database + let user = await prisma.user.findUnique({ + where: { publicKey }, + include: { + sentStreams: { + take: 10, + orderBy: { createdAt: 'desc' } + }, + receivedStreams: { + take: 10, + orderBy: { createdAt: 'desc' } + } + } + }); + + // If user doesn't exist in database, create in-memory user object + if (!user) { + logger.info(`User ${publicKey} authenticated but not in database, returning in-memory user`); + return res.status(200).json({ + publicKey, + sentStreams: [], + receivedStreams: [], + inMemory: true + }); + } + + return res.status(200).json(user); + } catch (error) { + next(error); + } +}; diff --git a/backend/src/lib/prisma-sandbox.ts b/backend/src/lib/prisma-sandbox.ts index 382da92..98b673f 100644 --- a/backend/src/lib/prisma-sandbox.ts +++ b/backend/src/lib/prisma-sandbox.ts @@ -32,15 +32,10 @@ export function getSandboxPrisma(): PrismaClient { } const sandboxPrisma = new PrismaClient({ - datasources: { - db: { - url: databaseUrl, - }, - }, - log: process.env.NODE_ENV === 'development' - ? ['query', 'error', 'warn'] + log: process.env.NODE_ENV === 'development' + ? ['query', 'error', 'warn'] : ['error'], - }); + } as any); if (process.env.NODE_ENV !== 'production') { globalForSandboxPrisma.sandboxPrisma = sandboxPrisma; diff --git a/backend/src/middleware/auth.middleware.ts b/backend/src/middleware/auth.middleware.ts new file mode 100644 index 0000000..f9a1426 --- /dev/null +++ b/backend/src/middleware/auth.middleware.ts @@ -0,0 +1,162 @@ +import type { Request, Response, NextFunction } from 'express'; +import * as StellarSdk from '@stellar/stellar-sdk'; +import type { AuthenticatedRequest, AuthUser } from '../types/auth.types.js'; +import logger from '../logger.js'; + +/** + * Stellar network passphrase (testnet or mainnet) + */ +const STELLAR_NETWORK = process.env.STELLAR_NETWORK === 'mainnet' + ? StellarSdk.Networks.PUBLIC + : StellarSdk.Networks.TESTNET; + +/** + * Extract Bearer token from Authorization header + */ +function extractBearerToken(req: Request): string | null { + const authHeader = req.headers.authorization; + + if (!authHeader) { + return null; + } + + const parts = authHeader.split(' '); + if (parts.length !== 2 || parts[0] !== 'Bearer') { + return null; + } + + return parts[1] ?? null; +} + +/** + * Verify Stellar signed message and extract public key + * + * For SEP-10 authentication, the token should be a signed transaction envelope (XDR) + * The transaction should contain: + * - A manage_data operation with key "auth" and random value + * - Source account is the authenticating user's public key + * - Valid signature from the user's keypair + */ +function verifySignedMessage(token: string): AuthUser | null { + try { + // Decode the transaction envelope from base64 XDR + const transaction = StellarSdk.TransactionBuilder.fromXDR( + token, + STELLAR_NETWORK + ) as StellarSdk.Transaction; + + // Extract the source account (user's public key) + const publicKey = transaction.source; + + // Verify the transaction has valid signatures + const keypair = StellarSdk.Keypair.fromPublicKey(publicKey); + const transactionHash = transaction.hash(); + + // Check if transaction has at least one signature + if (!transaction.signatures || transaction.signatures.length === 0) { + logger.warn('Transaction has no signatures'); + return null; + } + + // Verify at least one signature is valid for the source account + const isValid = transaction.signatures.some((signature) => { + try { + return keypair.verify(transactionHash, signature.signature()); + } catch { + return false; + } + }); + + if (!isValid) { + logger.warn('Invalid signature for public key:', publicKey); + return null; + } + + // Optional: Check transaction time bounds to prevent replay attacks + const now = Math.floor(Date.now() / 1000); + if (transaction.timeBounds) { + const minTime = parseInt(transaction.timeBounds.minTime); + const maxTime = parseInt(transaction.timeBounds.maxTime); + + if (minTime && now < minTime) { + logger.warn('Transaction not yet valid'); + return null; + } + + if (maxTime && now > maxTime) { + logger.warn('Transaction expired'); + return null; + } + } + + return { publicKey }; + } catch (error) { + logger.error('Error verifying signed message:', error); + return null; + } +} + +/** + * Authentication middleware + * + * Extracts Bearer token from Authorization header, + * verifies the Stellar signature, and attaches user to request. + * + * If authentication fails, returns 401 Unauthorized. + */ +export const authMiddleware = ( + req: Request, + res: Response, + next: NextFunction +): void => { + // Extract token from Bearer header + const token = extractBearerToken(req); + + if (!token) { + res.status(401).json({ + error: 'Unauthorized', + message: 'Missing or invalid Authorization header. Expected format: Bearer ' + }); + return; + } + + // Verify signature and extract user + const user = verifySignedMessage(token); + + if (!user) { + res.status(401).json({ + error: 'Unauthorized', + message: 'Invalid or expired signature' + }); + return; + } + + // Attach user to request + (req as AuthenticatedRequest).user = user; + + logger.debug(`Authenticated user: ${user.publicKey}`); + next(); +}; + +/** + * Optional authentication middleware + * + * Similar to authMiddleware but doesn't fail if token is missing. + * Useful for endpoints that have optional authentication. + */ +export const optionalAuthMiddleware = ( + req: Request, + res: Response, + next: NextFunction +): void => { + const token = extractBearerToken(req); + + if (token) { + const user = verifySignedMessage(token); + if (user) { + (req as AuthenticatedRequest).user = user; + } + } + + next(); +}; diff --git a/backend/src/middleware/error.middleware.ts b/backend/src/middleware/error.middleware.ts index 5360030..3b72121 100644 --- a/backend/src/middleware/error.middleware.ts +++ b/backend/src/middleware/error.middleware.ts @@ -1,5 +1,5 @@ import type { Request, Response, NextFunction } from 'express'; -import { Prisma } from '@prisma/client'; +import { Prisma } from '../generated/prisma/index.js'; import { ZodError } from 'zod'; import logger from '../logger.js'; @@ -18,7 +18,7 @@ export const errorHandler = ( if (err instanceof ZodError) { return res.status(400).json({ error: 'Validation Error', - details: err.errors.map(e => ({ + details: err.issues.map((e: any) => ({ path: e.path.join('.'), message: e.message })) diff --git a/backend/src/middleware/sandbox.middleware.ts b/backend/src/middleware/sandbox.middleware.ts index 295a139..5805da0 100644 --- a/backend/src/middleware/sandbox.middleware.ts +++ b/backend/src/middleware/sandbox.middleware.ts @@ -80,14 +80,15 @@ export function requireSandbox( next: NextFunction ): void { if (!isSandboxModeEnabled()) { - return res.status(503).json({ + res.status(503).json({ error: 'Sandbox mode not available', message: 'Sandbox mode is not enabled on this server.', }); + return; } if (!isSandboxRequest(req)) { - return res.status(400).json({ + res.status(400).json({ error: 'Sandbox mode required', message: 'This endpoint requires sandbox mode. Add X-Sandbox-Mode: true header or ?sandbox=true query parameter.', hint: { @@ -95,6 +96,7 @@ export function requireSandbox( queryParam: '?sandbox=true', }, }); + return; } next(); diff --git a/backend/src/routes/v1/user.routes.ts b/backend/src/routes/v1/user.routes.ts index 711ad59..e79cf36 100644 --- a/backend/src/routes/v1/user.routes.ts +++ b/backend/src/routes/v1/user.routes.ts @@ -1,5 +1,6 @@ import { Router } from 'express'; -import { registerUser, getUser, getUserEvents } from '../../controllers/user.controller.js'; +import { registerUser, getUser, getUserEvents, getCurrentUser } from '../../controllers/user.controller.js'; +import { authMiddleware } from '../../middleware/auth.middleware.js'; const router = Router(); @@ -62,8 +63,27 @@ const router = Router(); * $ref: '#/components/schemas/User' * 404: * description: User not found + * + * /v1/users/me: + * get: + * tags: + * - Users + * summary: Get current authenticated user + * description: Returns the currently authenticated user's details (protected endpoint) + * security: + * - BearerAuth: [] + * responses: + * 200: + * description: Current user details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/User' + * 401: + * description: Unauthorized - invalid or missing token */ router.post('/', registerUser); +router.get('/me', authMiddleware, getCurrentUser); router.get('/:publicKey', getUser); /** diff --git a/backend/src/types/auth.types.ts b/backend/src/types/auth.types.ts new file mode 100644 index 0000000..274be4d --- /dev/null +++ b/backend/src/types/auth.types.ts @@ -0,0 +1,33 @@ +import type { Request } from 'express'; + +/** + * User object attached to authenticated requests + */ +export interface AuthUser { + publicKey: string; + id?: string; +} + +/** + * Extended Express Request with authenticated user + */ +export interface AuthenticatedRequest extends Request { + user: AuthUser; +} + +/** + * SEP-10 Challenge Transaction payload + */ +export interface SEP10ChallengePayload { + transaction: string; + network_passphrase: string; +} + +/** + * SEP-10 Token payload + */ +export interface SEP10TokenPayload { + sub: string; // Stellar public key + iat: number; // Issued at + exp: number; // Expiration +} diff --git a/contracts/stream_contract/src/test.rs b/contracts/stream_contract/src/test.rs index ba2279c..d6ec9fe 100644 --- a/contracts/stream_contract/src/test.rs +++ b/contracts/stream_contract/src/test.rs @@ -112,10 +112,6 @@ fn test_initialize_rejects_second_call() { let admin = Address::generate(&env); let treasury = Address::generate(&env); - assert_eq!(stream_id1, 1); - assert_eq!(stream_id2, 2); - assert!(client.get_stream(&stream_id1).is_some()); - assert!(client.get_stream(&stream_id2).is_some()); client.initialize(&admin, &treasury, &100); let result = client.try_initialize(&admin, &treasury, &100); assert_eq!(result, Err(Ok(StreamError::AlreadyInitialized))); @@ -344,10 +340,6 @@ fn test_top_up_rejects_negative_amount() { let client = create_contract(&env); let id = client.create_stream(&sender, &Address::generate(&env), &token, &10_000, &100); - let contract_id = env.register(StreamContract, ()); - let client = StreamContractClient::new(&env, &contract_id); - let token_client = token::Client::new(&env, &token_address); - token_client.approve(&sender, &contract_id, &20_000, &1_000_000); assert_eq!( client.try_top_up_stream(&sender, &id, &-50), Err(Ok(StreamError::InvalidAmount)) @@ -522,10 +514,6 @@ fn test_withdraw_emits_event() { let client = create_contract(&env); let id = client.create_stream(&sender, &recipient, &token, &500, &100); - let contract_id = env.register(StreamContract, ()); - let client = StreamContractClient::new(&env, &contract_id); - let token_client = token::Client::new(&env, &token_address); - token_client.approve(&sender, &contract_id, &20_000, &1_000_000); // Advance time by 100 seconds to allow full withdrawal (500 tokens / 100 seconds = 5 tokens/sec) env.ledger().with_mut(|l| { l.timestamp += 100; diff --git a/package-lock.json b/package-lock.json index d8d0a69..ab5fdd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,12 @@ "devDependencies": { "husky": "^9.1.7", "lint-staged": "^16.2.7" + }, + "optionalDependencies": { + "@tailwindcss/oxide-darwin-arm64": "^4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "^4.2.1", + "lightningcss-darwin-arm64": "^1.31.1", + "lightningcss-linux-x64-gnu": "^1.31.1" } }, "backend": { @@ -24,11 +30,13 @@ "license": "ISC", "dependencies": { "@prisma/adapter-pg": "^7.4.1", + "@stellar/stellar-sdk": "^14.5.0", "cors": "^2.8.6", "dotenv": "^17.3.1", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "pg": "^8.18.0", + "stellar-sdk": "^13.3.0", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", "winston": "^3.11.0", @@ -52,6 +60,14 @@ "vitest": "^4.0.18" } }, + "backend/node_modules/@types/node": { + "version": "25.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, "frontend": { "version": "0.1.0", "dependencies": { @@ -74,35 +90,6 @@ "typescript": "^5" } }, - "frontend/node_modules/@stellar/stellar-sdk": { - "version": "14.5.0", - "license": "Apache-2.0", - "dependencies": { - "@stellar/stellar-base": "^14.0.4", - "axios": "^1.13.3", - "bignumber.js": "^9.3.1", - "commander": "^14.0.2", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.1" - }, - "bin": { - "stellar-js": "bin/stellar-js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "frontend/node_modules/@types/node": { - "version": "20.19.33", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "dev": true, @@ -200,14 +187,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.29.1", "dev": true, @@ -238,14 +217,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "dev": true, @@ -463,16 +434,16 @@ "@electric-sql/pglite": "0.3.15" } }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.27.3", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">=18" @@ -550,18 +521,18 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.4", + "version": "3.3.3", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.14.0", + "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.1", - "minimatch": "^3.1.3", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { @@ -665,38 +636,38 @@ "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", "cpu": [ - "x64" + "arm64" ], - "license": "LGPL-3.0-or-later", + "license": "Apache-2.0", "optional": true, "os": [ - "linux" + "darwin" ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, "funding": { "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", "cpu": [ - "x64" + "arm64" ], - "license": "Apache-2.0", + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "linux" + "darwin" ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, "funding": { "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@jridgewell/gen-mapping": { @@ -767,15 +738,15 @@ "fast-glob": "3.3.1" } }, - "node_modules/@next/swc-linux-x64-gnu": { + "node_modules/@next/swc-darwin-arm64": { "version": "16.1.6", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { "node": ">= 10" @@ -846,8 +817,6 @@ }, "node_modules/@paralleldrive/cuid2": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", "dev": true, "license": "MIT", "dependencies": { @@ -977,385 +946,47 @@ "dev": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "7.4.1" - } - }, - "node_modules/@prisma/get-platform": { - "version": "7.2.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "7.2.0" - } - }, - "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { - "version": "7.2.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/query-plan-executor": { - "version": "7.2.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/studio-core": { - "version": "0.13.1", - "dev": true, - "license": "Apache-2.0", - "peerDependencies": { - "@types/react": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "@prisma/debug": "7.4.1" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], + "node_modules/@prisma/get-platform": { + "version": "7.2.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.2.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], + "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { + "version": "7.2.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "Apache-2.0" }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], + "node_modules/@prisma/query-plan-executor": { + "version": "7.2.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "Apache-2.0" }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], + "node_modules/@prisma/studio-core": { + "version": "0.13.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "Apache-2.0", + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ] }, "node_modules/@rtsao/scc": { @@ -1389,6 +1020,16 @@ "semver": "7.7.1" } }, + "node_modules/@stellar/freighter-api/node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@stellar/js-xdr": { "version": "3.1.2", "license": "Apache-2.0" @@ -1408,6 +1049,27 @@ "node": ">=20.0.0" } }, + "node_modules/@stellar/stellar-sdk": { + "version": "14.5.0", + "license": "Apache-2.0", + "dependencies": { + "@stellar/stellar-base": "^14.0.4", + "axios": "^1.13.3", + "bignumber.js": "^9.3.1", + "commander": "^14.0.2", + "eventsource": "^2.0.2", + "feaxios": "^0.0.23", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.1" + }, + "bin": { + "stellar-js": "bin/stellar-js" + }, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "license": "Apache-2.0", @@ -1451,12 +1113,27 @@ "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1509,8 +1186,6 @@ }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -1528,8 +1203,6 @@ }, "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" }, @@ -1543,8 +1216,6 @@ }, "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" }, @@ -1590,21 +1261,19 @@ }, "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/node": { - "version": "25.3.0", + "version": "20.19.33", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/node/node_modules/undici-types": { - "version": "7.18.2", + "version": "6.21.0", "dev": true, "license": "MIT" }, @@ -1663,8 +1332,6 @@ }, "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": { @@ -1676,8 +1343,6 @@ }, "node_modules/@types/supertest": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-7.2.0.tgz", - "integrity": "sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==", "dev": true, "license": "MIT", "dependencies": { @@ -1893,7 +1558,7 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.4", + "version": "10.2.2", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1966,22 +1631,20 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.11.1", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ] }, "node_modules/@vitest/expect": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1998,8 +1661,6 @@ }, "node_modules/@vitest/mocker": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2025,8 +1686,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", "dev": true, "license": "MIT", "dependencies": { @@ -2038,8 +1697,6 @@ }, "node_modules/@vitest/runner": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", "dev": true, "license": "MIT", "dependencies": { @@ -2052,8 +1709,6 @@ }, "node_modules/@vitest/snapshot": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", "dev": true, "license": "MIT", "dependencies": { @@ -2067,8 +1722,6 @@ }, "node_modules/@vitest/spy": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", "dev": true, "license": "MIT", "funding": { @@ -2077,8 +1730,6 @@ }, "node_modules/@vitest/utils": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", "dev": true, "license": "MIT", "dependencies": { @@ -2147,8 +1798,6 @@ }, "node_modules/ansi-escapes": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", "dependencies": { @@ -2163,8 +1812,6 @@ }, "node_modules/ansi-regex": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -2363,15 +2010,11 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "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": { @@ -2453,6 +2096,44 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/bare-addon-resolve": { + "version": "1.10.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-module-resolve": "^1.10.0", + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, + "node_modules/bare-module-resolve": { + "version": "1.12.1", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-semver": "^1.0.0" + }, + "peerDependencies": { + "bare-url": "*" + }, + "peerDependenciesMeta": { + "bare-url": { + "optional": true + } + } + }, + "node_modules/bare-semver": { + "version": "1.0.2", + "license": "Apache-2.0", + "optional": true + }, "node_modules/base32.js": { "version": "0.1.0", "license": "MIT", @@ -2745,8 +2426,6 @@ }, "node_modules/chai": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -2825,8 +2504,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { @@ -2841,8 +2518,6 @@ }, "node_modules/cli-truncate": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", - "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "dev": true, "license": "MIT", "dependencies": { @@ -2923,8 +2598,6 @@ }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, @@ -2947,8 +2620,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": { @@ -3011,8 +2682,6 @@ }, "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" }, @@ -3207,8 +2876,6 @@ }, "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": { @@ -3313,8 +2980,6 @@ }, "node_modules/environment": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -3433,8 +3098,6 @@ }, "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" }, @@ -3760,14 +3423,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "dev": true, @@ -3867,14 +3522,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { "version": "8.4.0", "dev": true, @@ -3949,8 +3596,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": { @@ -3973,8 +3618,6 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true, "license": "MIT" }, @@ -3987,8 +3630,6 @@ }, "node_modules/expect-type": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4121,8 +3762,6 @@ }, "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" }, @@ -4301,8 +3940,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": { @@ -4341,10 +3978,7 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -4414,8 +4048,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -4563,8 +4195,6 @@ }, "node_modules/goober": { "version": "2.1.18", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", - "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", "license": "MIT", "peerDependencies": { "csstype": "^3.0.10" @@ -4717,8 +4347,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -4920,6 +4548,17 @@ "semver": "^7.7.1" } }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "license": "MIT", @@ -4999,8 +4638,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5409,18 +5046,38 @@ "lightningcss-win32-x64-msvc": "1.31.1" } }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-linux-x64-gnu": { "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ "linux" ], - "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -5439,8 +5096,6 @@ }, "node_modules/lint-staged": { "version": "16.2.7", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.2.7.tgz", - "integrity": "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==", "dev": true, "license": "MIT", "dependencies": { @@ -5464,8 +5119,6 @@ }, "node_modules/listr2": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", - "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { @@ -5518,8 +5171,6 @@ }, "node_modules/log-update": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", "dev": true, "license": "MIT", "dependencies": { @@ -5643,8 +5294,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": { @@ -5665,8 +5314,6 @@ }, "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": { @@ -5699,8 +5346,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", "engines": { @@ -5711,7 +5356,7 @@ } }, "node_modules/minimatch": { - "version": "3.1.5", + "version": "3.1.3", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -5764,8 +5409,6 @@ }, "node_modules/nano-spawn": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-2.0.0.tgz", - "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", "dev": true, "license": "MIT", "engines": { @@ -5919,14 +5562,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-exports-info/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/node-fetch-native": { "version": "1.6.7", "dev": true, @@ -5992,7 +5627,7 @@ } }, "node_modules/nodemon/node_modules/minimatch": { - "version": "10.2.4", + "version": "10.2.2", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -6005,6 +5640,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/nodemon/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "dev": true, @@ -6152,8 +5798,6 @@ }, "node_modules/obug": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -6192,8 +5836,6 @@ }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6206,11 +5848,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openapi-types": { - "version": "12.1.3", - "license": "MIT", - "peer": true - }, "node_modules/optionator": { "version": "0.9.4", "dev": true, @@ -6336,12 +5973,12 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.19.0", + "version": "8.18.0", "license": "MIT", "dependencies": { "pg-connection-string": "^2.11.0", - "pg-pool": "^3.12.0", - "pg-protocol": "^1.12.0", + "pg-pool": "^3.11.0", + "pg-protocol": "^1.11.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, @@ -6377,14 +6014,14 @@ } }, "node_modules/pg-pool": { - "version": "3.12.0", + "version": "3.11.0", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.12.0", + "version": "1.11.0", "license": "MIT" }, "node_modules/pg-types": { @@ -6432,8 +6069,6 @@ }, "node_modules/pidtree": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "license": "MIT", "bin": { @@ -6725,8 +6360,6 @@ }, "node_modules/react-hot-toast": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", - "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", "license": "MIT", "dependencies": { "csstype": "^3.1.3", @@ -6821,6 +6454,17 @@ "url": "https://github.com/sponsors/remeda" } }, + "node_modules/require-addon": { + "version": "1.2.0", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-addon-resolve": "^1.3.0" + }, + "engines": { + "bare": ">=1.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "dev": true, @@ -6858,8 +6502,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { @@ -6892,15 +6534,11 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rollup": { "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -7061,13 +6699,11 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", + "version": "6.3.1", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/send": { @@ -7318,8 +6954,6 @@ }, "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" }, @@ -7345,10 +6979,19 @@ "node": ">=10" } }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/slice-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", - "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -7364,8 +7007,6 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -7375,6 +7016,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/sodium-native": { + "version": "4.3.3", + "license": "MIT", + "optional": true, + "dependencies": { + "require-addon": "^1.1.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "license": "BSD-3-Clause", @@ -7411,8 +7060,6 @@ }, "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" }, @@ -7428,6 +7075,41 @@ "dev": true, "license": "MIT" }, + "node_modules/stellar-sdk": { + "version": "13.3.0", + "license": "Apache-2.0", + "dependencies": { + "@stellar/stellar-base": "^13.1.0", + "axios": "^1.8.4", + "bignumber.js": "^9.3.0", + "eventsource": "^2.0.2", + "feaxios": "^0.0.23", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/stellar-sdk/node_modules/@stellar/stellar-base": { + "version": "13.1.0", + "license": "Apache-2.0", + "dependencies": { + "@stellar/js-xdr": "^3.1.2", + "base32.js": "^0.1.0", + "bignumber.js": "^9.1.2", + "buffer": "^6.0.3", + "sha.js": "^2.3.6", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "sodium-native": "^4.3.3" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "dev": true, @@ -7449,8 +7131,6 @@ }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { @@ -7459,8 +7139,6 @@ }, "node_modules/string-width": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", - "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "dev": true, "license": "MIT", "dependencies": { @@ -7577,8 +7255,6 @@ }, "node_modules/strip-ansi": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -7633,8 +7309,6 @@ }, "node_modules/superagent": { "version": "10.3.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", - "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7654,8 +7328,6 @@ }, "node_modules/supertest": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", - "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", "dev": true, "license": "MIT", "dependencies": { @@ -7784,8 +7456,6 @@ }, "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" }, @@ -7841,8 +7511,6 @@ }, "node_modules/tinyrainbow": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -7995,6 +7663,10 @@ "fsevents": "~2.3.3" } }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "license": "Unlicense" + }, "node_modules/type-check": { "version": "0.4.0", "dev": true, @@ -8144,7 +7816,7 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.21.0", + "version": "7.18.2", "dev": true, "license": "MIT" }, @@ -8267,8 +7939,6 @@ }, "node_modules/vite": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", "dependencies": { @@ -8342,8 +8012,6 @@ }, "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": { @@ -8360,8 +8028,6 @@ }, "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": { @@ -8373,8 +8039,6 @@ }, "node_modules/vitest": { "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8451,8 +8115,6 @@ }, "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": { @@ -8558,8 +8220,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": { @@ -8615,8 +8275,6 @@ }, "node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -8633,8 +8291,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -8646,15 +8302,11 @@ }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8687,8 +8339,6 @@ }, "node_modules/yaml": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "dev": true, "license": "ISC", "bin": { diff --git a/package.json b/package.json index c56cf2c..974738a 100644 --- a/package.json +++ b/package.json @@ -23,5 +23,11 @@ }, "dependencies": { "react-hot-toast": "^2.6.0" + }, + "optionalDependencies": { + "@tailwindcss/oxide-darwin-arm64": "^4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "^4.2.1", + "lightningcss-darwin-arm64": "^1.31.1", + "lightningcss-linux-x64-gnu": "^1.31.1" } }