From 25d5510b53fa894529b7a6ae0ed62b1098f02fcb Mon Sep 17 00:00:00 2001 From: Micheal-Blessed <295943952+Micheal-Blessed@users.noreply.github.com> Date: Tue, 30 Jun 2026 00:29:57 +0100 Subject: [PATCH 01/19] feat: add paid-route error taxonomy for analytics and CLI output (#83) --- apps/agent-client/src/cli.ts | 3 + apps/agent-client/src/client.ts | 5 ++ apps/agent-client/src/validate-real.ts | 3 +- apps/api/src/app.ts | 28 +++++++- apps/api/src/lib/payment-evidence.ts | 2 + apps/api/src/lib/persistence.ts | 3 + apps/api/src/lib/storage/serialization.ts | 12 ++-- apps/api/src/lib/storage/sqlite/migrations.ts | 2 + apps/api/src/lib/storage/sqlite/repository.ts | 8 +-- apps/api/src/lib/x402.ts | 8 ++- .../src/routes/protected.idempotency.test.ts | 16 +++-- apps/api/src/routes/protected.ts | 6 +- .../src/routes/protected.validation.test.ts | 69 ++++++++++++++++--- apps/api/src/services/query-service.ts | 20 +++++- packages/shared/src/schemas.ts | 9 +++ packages/shared/src/types.ts | 6 ++ 16 files changed, 168 insertions(+), 32 deletions(-) diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 5273236..9f22276 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -54,6 +54,9 @@ async function main() { console.log(`Endpoint: ${result.endpoint}`); console.log(`Provider: ${provider}`); console.log(`Status: ${result.status}`); + if (!result.ok && (result.body as any)?.errorCode) { + console.log(`Error Code: ${(result.body as any).errorCode}`); + } console.log(`Payment Header: ${result.paymentResponse ?? ""}`); const payload = result.body as Record; diff --git a/apps/agent-client/src/client.ts b/apps/agent-client/src/client.ts index 8faee0d..33a6416 100644 --- a/apps/agent-client/src/client.ts +++ b/apps/agent-client/src/client.ts @@ -102,6 +102,11 @@ export async function runPaidQuery(input: { } const json = await response.json(); + if (!response.ok || response.status === 402) { + if (json && typeof json === "object" && !json.errorCode) { + json.errorCode = response.status === 402 ? "payment_required" : "internal_error"; + } + } return { endpoint, diff --git a/apps/agent-client/src/validate-real.ts b/apps/agent-client/src/validate-real.ts index 134808f..a40185f 100644 --- a/apps/agent-client/src/validate-real.ts +++ b/apps/agent-client/src/validate-real.ts @@ -119,8 +119,9 @@ async function main() { }); if (!result.ok) { + const errorCode = (result.body as any)?.errorCode ? ` [${(result.body as any).errorCode}]` : ""; throw new Error( - `Paid request failed with status ${result.status}. Response: ${JSON.stringify(result.body)}` + `Paid request failed with status ${result.status}${errorCode}. Response: ${JSON.stringify(result.body)}` ); } diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index 77835ba..62b7528 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -9,6 +9,7 @@ import { logger } from "./lib/logger.js"; import { config } from "./lib/config.js"; import { UnsafeScrapeUrlError } from "./lib/scrape-url-safety.js"; import { PaymentEvidenceError } from "./lib/payment-evidence.js"; +import { ProviderTimeoutError, ProviderFailedError } from "./services/query-service.js"; export const app = express(); @@ -65,7 +66,8 @@ app.use( if (error instanceof UnsafeScrapeUrlError) { res.status(400).json({ error: "Scrape URL is not allowed", - type: "unsafe_scrape_url" + type: "unsafe_scrape_url", + errorCode: "invalid_query" }); return; } @@ -73,14 +75,34 @@ app.use( if (error instanceof PaymentEvidenceError) { res.status(400).json({ error: error.message, - type: "payment_evidence_error" + type: "payment_evidence_error", + errorCode: "payment_invalid" + }); + return; + } + + if (error instanceof ProviderTimeoutError) { + res.status(504).json({ + error: error.message, + type: "provider_timeout", + errorCode: "provider_timeout" + }); + return; + } + + if (error instanceof ProviderFailedError) { + res.status(502).json({ + error: error.message, + type: "provider_failed", + errorCode: "provider_failed" }); return; } res.status(500).json({ error: error.message, - type: "internal_error" + type: "internal_error", + errorCode: "internal_error" }); } ); diff --git a/apps/api/src/lib/payment-evidence.ts b/apps/api/src/lib/payment-evidence.ts index 74622c1..b850eee 100644 --- a/apps/api/src/lib/payment-evidence.ts +++ b/apps/api/src/lib/payment-evidence.ts @@ -349,6 +349,7 @@ export async function persistPaymentEvidence( facilitatorResult: "facilitatorResult" in evidence ? toJsonRecord(evidence.facilitatorResult) : undefined, error: evidence.kind === "failed" ? evidence.error : undefined, + errorCode: evidence.kind === "failed" ? "payment_invalid" : undefined, createdAt: now }; @@ -370,6 +371,7 @@ export async function persistPaymentEvidence( facilitatorUrl: evidence.facilitatorUrl, payerPublicKey: evidence.payer, traceId: record.traceId, + errorCode: evidence.kind === "failed" ? "payment_invalid" : undefined, createdAt: now, latencyMs: record.latencyMs }; diff --git a/apps/api/src/lib/persistence.ts b/apps/api/src/lib/persistence.ts index 6dcc79c..d3cacd4 100644 --- a/apps/api/src/lib/persistence.ts +++ b/apps/api/src/lib/persistence.ts @@ -26,6 +26,7 @@ export interface PersistPaidRequestInput { paymentResponseHeader: string | null; execution: ProviderExecutionMetadata; payerPublicKey?: string; + errorCode?: string; } export interface PersistSponsoredPaymentInput extends PersistPaidRequestInput { @@ -53,6 +54,7 @@ function buildPaymentAttempt( facilitatorUrl: config.X402_FACILITATOR_URL, status: "settled", transactionHash: input.paymentResponseHeader ?? undefined, + errorCode: input.errorCode as any, createdAt: now, ...overrides }; @@ -77,6 +79,7 @@ function buildUsageEvent( facilitatorUrl: config.X402_FACILITATOR_URL, payerPublicKey: input.payerPublicKey, traceId: input.traceId, + errorCode: input.errorCode as any, createdAt: now, latencyMs: input.latencyMs, execution: input.execution, diff --git a/apps/api/src/lib/storage/serialization.ts b/apps/api/src/lib/storage/serialization.ts index 5d40810..709e149 100644 --- a/apps/api/src/lib/storage/serialization.ts +++ b/apps/api/src/lib/storage/serialization.ts @@ -159,7 +159,8 @@ export function usageEventToRow(event: UsageEvent) { sponsorship_grant_id: event.sponsorshipGrantId ?? null, policy_decision: event.policyDecision ?? null, payment_source: event.paymentSource ?? null, - sponsor_public_key: event.sponsorPublicKey ?? null + sponsor_public_key: event.sponsorPublicKey ?? null, + error_code: event.errorCode ?? null }; } @@ -211,7 +212,8 @@ export function rowToUsageEvent(row: Record): UsageEvent { paymentSource: row.payment_source ? (row.payment_source as UsageEvent["paymentSource"]) : undefined, - sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined + sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined, + errorCode: row.error_code ? (row.error_code as UsageEvent["errorCode"]) : undefined }; } @@ -238,7 +240,8 @@ export function paymentAttemptToRow(payment: PaymentAttempt) { sponsorship_grant_id: payment.sponsorshipGrantId ?? null, policy_decision: payment.policyDecision ?? null, payment_source: payment.paymentSource ?? null, - sponsor_public_key: payment.sponsorPublicKey ?? null + sponsor_public_key: payment.sponsorPublicKey ?? null, + error_code: payment.errorCode ?? null }; } @@ -269,6 +272,7 @@ export function rowToPaymentAttempt(row: Record): PaymentAttemp paymentSource: row.payment_source ? (row.payment_source as PaymentAttempt["paymentSource"]) : undefined, - sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined + sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined, + errorCode: row.error_code ? (row.error_code as PaymentAttempt["errorCode"]) : undefined }; } diff --git a/apps/api/src/lib/storage/sqlite/migrations.ts b/apps/api/src/lib/storage/sqlite/migrations.ts index 667f938..513c6d9 100644 --- a/apps/api/src/lib/storage/sqlite/migrations.ts +++ b/apps/api/src/lib/storage/sqlite/migrations.ts @@ -84,6 +84,8 @@ ALTER TABLE usage_events ADD COLUMN execution_fallback_reason TEXT; ALTER TABLE usage_events ADD COLUMN execution_latency_estimate_ms INTEGER; ALTER TABLE usage_events ADD COLUMN execution_observed_duration_ms INTEGER; ALTER TABLE usage_events ADD COLUMN execution_circuit_breaker_state TEXT; +ALTER TABLE usage_events ADD COLUMN error_code TEXT; +ALTER TABLE payment_attempts ADD COLUMN error_code TEXT; ` } ]; diff --git a/apps/api/src/lib/storage/sqlite/repository.ts b/apps/api/src/lib/storage/sqlite/repository.ts index 836c934..9313d94 100644 --- a/apps/api/src/lib/storage/sqlite/repository.ts +++ b/apps/api/src/lib/storage/sqlite/repository.ts @@ -27,7 +27,7 @@ INSERT INTO usage_events ( execution_source, execution_used_fallback, execution_fallback_reason, execution_latency_estimate_ms, execution_observed_duration_ms, execution_circuit_breaker_state, sponsorship_grant_id, policy_decision, - payment_source, sponsor_public_key + payment_source, sponsor_public_key, error_code ) VALUES ( @id, @mode, @endpoint, @provider_id, @query_or_url, @price_usd, @network, @payment_status, @payment_kind, @payment_tx_hash, @asset, @pay_to_address, @amount, @@ -35,7 +35,7 @@ INSERT INTO usage_events ( @execution_source, @execution_used_fallback, @execution_fallback_reason, @execution_latency_estimate_ms, @execution_observed_duration_ms, @execution_circuit_breaker_state, @sponsorship_grant_id, @policy_decision, - @payment_source, @sponsor_public_key + @payment_source, @sponsor_public_key, @error_code ) `; @@ -44,12 +44,12 @@ INSERT INTO payment_attempts ( id, endpoint, provider_id, amount_usd, network, asset, amount, evidence_kind, payer_public_key, pay_to_address, facilitator_url, status, transaction_hash, facilitator_result, error, created_at, sponsorship_grant_id, policy_decision, - payment_source, sponsor_public_key + payment_source, sponsor_public_key, error_code ) VALUES ( @id, @endpoint, @provider_id, @amount_usd, @network, @asset, @amount, @evidence_kind, @payer_public_key, @pay_to_address, @facilitator_url, @status, @transaction_hash, @facilitator_result, @error, @created_at, @sponsorship_grant_id, @policy_decision, - @payment_source, @sponsor_public_key + @payment_source, @sponsor_public_key, @error_code ) `; diff --git a/apps/api/src/lib/x402.ts b/apps/api/src/lib/x402.ts index 5bf6315..82d9457 100644 --- a/apps/api/src/lib/x402.ts +++ b/apps/api/src/lib/x402.ts @@ -99,6 +99,7 @@ function demoMode402Middleware(req: Request, res: Response, next: NextFunction) return res.status(402).json({ error: "Payment Required", + errorCode: "payment_required", demoMode: true, debug, accepts: { @@ -174,7 +175,12 @@ export function createX402Middleware() { return { contentType: "application/json", - body: { error: "Payment settlement failed", type: "payment_settlement_failed", debug } + body: { + error: "Payment settlement failed", + type: "payment_settlement_failed", + errorCode: "payment_invalid", + debug + } }; }; diff --git a/apps/api/src/routes/protected.idempotency.test.ts b/apps/api/src/routes/protected.idempotency.test.ts index d363824..6bf4f44 100644 --- a/apps/api/src/routes/protected.idempotency.test.ts +++ b/apps/api/src/routes/protected.idempotency.test.ts @@ -3,9 +3,9 @@ import express from "express"; import request from "supertest"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { - applySponsorshipTestEnv, - resetSponsorshipStore -} from "../test/sponsorship-test-helpers.js"; + applyApiTestEnv, + resetApiTestStorage +} from "../test/api-test-helpers.js"; const executeQueryMock = vi.fn(); @@ -66,17 +66,19 @@ function demoPaidRequest(app: express.Express) { } describe("x402 idempotency", () => { - let dbPath: string | undefined; + let analyticsDbPath: string | undefined; + let sponsorshipDbPath: string | undefined; beforeEach(() => { - dbPath = applySponsorshipTestEnv(); + ({ analyticsDbPath, sponsorshipDbPath } = applyApiTestEnv()); executeQueryMock.mockReset(); mockQueryResult(); }); afterEach(async () => { - await resetSponsorshipStore(dbPath); - dbPath = undefined; + await resetApiTestStorage(analyticsDbPath, sponsorshipDbPath); + analyticsDbPath = undefined; + sponsorshipDbPath = undefined; }); it("returns cached response for idempotent retries", async () => { diff --git a/apps/api/src/routes/protected.ts b/apps/api/src/routes/protected.ts index c9d6543..95bcdc1 100644 --- a/apps/api/src/routes/protected.ts +++ b/apps/api/src/routes/protected.ts @@ -8,7 +8,7 @@ export const protectedRouter = Router(); protectedRouter.get("/x402/search", async (req, res, next) => { const parsed = searchQuerySchema.safeParse(req.query); if (!parsed.success) { - return res.status(400).json({ error: parsed.error.flatten() }); + return res.status(400).json({ error: parsed.error.flatten(), errorCode: "invalid_query" }); } return handlePaidX402Route(req, res, next, { @@ -29,7 +29,7 @@ protectedRouter.get("/x402/search", async (req, res, next) => { protectedRouter.get("/x402/news", async (req, res, next) => { const parsed = newsQuerySchema.safeParse(req.query); if (!parsed.success) { - return res.status(400).json({ error: parsed.error.flatten() }); + return res.status(400).json({ error: parsed.error.flatten(), errorCode: "invalid_query" }); } return handlePaidX402Route(req, res, next, { @@ -50,7 +50,7 @@ protectedRouter.get("/x402/news", async (req, res, next) => { protectedRouter.get("/x402/scrape", async (req, res, next) => { const parsed = scrapeQuerySchema.safeParse(req.query); if (!parsed.success) { - return res.status(400).json({ error: parsed.error.flatten() }); + return res.status(400).json({ error: parsed.error.flatten(), errorCode: "invalid_query" }); } return handlePaidX402Route(req, res, next, { diff --git a/apps/api/src/routes/protected.validation.test.ts b/apps/api/src/routes/protected.validation.test.ts index c50f79c..9da7032 100644 --- a/apps/api/src/routes/protected.validation.test.ts +++ b/apps/api/src/routes/protected.validation.test.ts @@ -5,9 +5,13 @@ import { applyApiTestEnv, resetApiTestStorage, TEST_WALLET } from "../test/api-t const executeQueryMock = vi.fn(); -vi.mock("../services/query-service.js", () => ({ - executeQuery: (...args: unknown[]) => executeQueryMock(...args) -})); +vi.mock("../services/query-service.js", async (importOriginal) => { + const original = await importOriginal(); + return { + ...original, + executeQuery: (...args: unknown[]) => executeQueryMock(...args) + }; +}); vi.mock("../lib/persistence.js", () => ({ persistPaymentAndUsage: vi.fn().mockResolvedValue(undefined), @@ -33,12 +37,13 @@ function mockQueryResult(mode: string, providerId: string, priceUsd: number) { }); } -describe("protected route validation", () => { +describe("protected route validation and error handling", () => { let analyticsDbPath: string; let sponsorshipDbPath: string; beforeEach(() => { ({ analyticsDbPath, sponsorshipDbPath } = applyApiTestEnv()); + executeQueryMock.mockReset(); }); afterEach(async () => { @@ -48,12 +53,30 @@ describe("protected route validation", () => { async function createValidationApp() { const { protectedRouter } = await import("../routes/protected.js"); + const { UnsafeScrapeUrlError } = await import("../lib/scrape-url-safety.js"); + const { PaymentEvidenceError } = await import("../lib/payment-evidence.js"); + const { ProviderTimeoutError, ProviderFailedError } = await import("../services/query-service.js"); const app = express(); app.use(protectedRouter); + app.use((error: any, _req: any, res: any, _next: any) => { + if (error instanceof UnsafeScrapeUrlError) { + return res.status(400).json({ error: error.message, type: "unsafe_scrape_url", errorCode: "invalid_query" }); + } + if (error instanceof PaymentEvidenceError) { + return res.status(400).json({ error: error.message, type: "payment_evidence_error", errorCode: "payment_invalid" }); + } + if (error instanceof ProviderTimeoutError) { + return res.status(504).json({ error: error.message, type: "provider_timeout", errorCode: "provider_timeout" }); + } + if (error instanceof ProviderFailedError) { + return res.status(502).json({ error: error.message, type: "provider_failed", errorCode: "provider_failed" }); + } + return res.status(500).json({ error: error.message, type: "internal_error", errorCode: "internal_error" }); + }); return app; } - it("rejects invalid search query input", async () => { + it("rejects invalid search query input with invalid_query", async () => { const app = await createValidationApp(); const missingQuery = await request(app).get("/x402/search").query({ provider: "search.basic" }); @@ -62,19 +85,21 @@ describe("protected route validation", () => { .query({ provider: "search.basic", q: "x" }); expect(missingQuery.status).toBe(400); + expect(missingQuery.body.errorCode).toBe("invalid_query"); expect(shortQuery.status).toBe(400); + expect(shortQuery.body.errorCode).toBe("invalid_query"); }); - it("rejects invalid news query input", async () => { + it("rejects invalid news query input with invalid_query", async () => { const app = await createValidationApp(); const response = await request(app).get("/x402/news").query({ provider: "news.fast" }); expect(response.status).toBe(400); - expect(response.body.error).toBeDefined(); + expect(response.body.errorCode).toBe("invalid_query"); }); - it("rejects invalid scrape query input", async () => { + it("rejects invalid scrape query input with invalid_query", async () => { const app = await createValidationApp(); const missingUrl = await request(app).get("/x402/scrape").query({ provider: "scrape.page" }); @@ -83,7 +108,35 @@ describe("protected route validation", () => { .query({ provider: "scrape.page", url: "not-a-url" }); expect(missingUrl.status).toBe(400); + expect(missingUrl.body.errorCode).toBe("invalid_query"); expect(invalidUrl.status).toBe(400); + expect(invalidUrl.body.errorCode).toBe("invalid_query"); + }); + + it("handles provider timeout and returns provider_timeout", async () => { + const { ProviderTimeoutError } = await import("../services/query-service.js"); + const app = await createValidationApp(); + executeQueryMock.mockRejectedValueOnce(new ProviderTimeoutError("Request timed out")); + + const response = await request(app) + .get("/x402/search") + .query({ provider: "search.basic", q: "valid query" }); + + expect(response.status).toBe(504); + expect(response.body.errorCode).toBe("provider_timeout"); + }); + + it("handles provider failure and returns provider_failed", async () => { + const { ProviderFailedError } = await import("../services/query-service.js"); + const app = await createValidationApp(); + executeQueryMock.mockRejectedValueOnce(new ProviderFailedError("Provider down")); + + const response = await request(app) + .get("/x402/search") + .query({ provider: "search.basic", q: "valid query" }); + + expect(response.status).toBe(502); + expect(response.body.errorCode).toBe("provider_failed"); }); }); diff --git a/apps/api/src/services/query-service.ts b/apps/api/src/services/query-service.ts index c815992..27dd723 100644 --- a/apps/api/src/services/query-service.ts +++ b/apps/api/src/services/query-service.ts @@ -35,6 +35,20 @@ function sanitizeErrorMessage(message: string): string { .replace(/https?:\/\/\S+/gi, "[redacted-url]"); } +export class ProviderTimeoutError extends Error { + constructor(message: string) { + super(message); + this.name = "ProviderTimeoutError"; + } +} + +export class ProviderFailedError extends Error { + constructor(message: string) { + super(message); + this.name = "ProviderFailedError"; + } +} + export async function executeQuery(params: { mode: "search" | "news" | "scrape"; provider: string; @@ -66,7 +80,11 @@ export async function executeQuery(params: { }, "provider execution failed" ); - throw error; + const msg = getErrorMessage(error); + if (msg.toLowerCase().includes("timeout")) { + throw new ProviderTimeoutError(msg); + } + throw new ProviderFailedError(msg); } const latencyMs = execution.execution.observedDurationMs; diff --git a/packages/shared/src/schemas.ts b/packages/shared/src/schemas.ts index 2fe1fa0..c1eaa2a 100644 --- a/packages/shared/src/schemas.ts +++ b/packages/shared/src/schemas.ts @@ -104,3 +104,12 @@ export const sponsorshipPreviewResponseSchema = z.object({ }), reason: z.string().optional() }); + +export const paidRouteErrorCodeSchema = z.enum([ + "payment_required", + "payment_invalid", + "provider_timeout", + "provider_failed", + "invalid_query", + "internal_error" +]); diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index ecc0687..13c5a88 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,3 +1,6 @@ +import { z } from "zod"; +import { paidRouteErrorCodeSchema } from "./schemas.js"; + export type QueryMode = "search" | "news" | "scrape"; export type ProviderCategory = QueryMode; export type SourceType = "live" | "deterministic-fallback" | "unavailable"; @@ -10,6 +13,7 @@ export type ExecutionFallbackReason = | "missing-fallback"; export type CircuitBreakerState = "closed" | "half-open" | "open"; export type PaymentSource = "sponsored" | "wallet" | "demo"; +export type PaidRouteErrorCode = z.infer; export interface ProviderExecutionMetadata { providerId: string; @@ -78,6 +82,7 @@ export interface UsageEvent { policyDecision?: string; paymentSource?: PaymentSource; sponsorPublicKey?: string; + errorCode?: PaidRouteErrorCode; } export interface PaymentAttempt { @@ -101,6 +106,7 @@ export interface PaymentAttempt { policyDecision?: string; paymentSource?: PaymentSource; sponsorPublicKey?: string; + errorCode?: PaidRouteErrorCode; } export interface AnalyticsSummary { From 70bfafbb80e0296f81d47d3264cdfb8b804aaeac Mon Sep 17 00:00:00 2001 From: Seunfunmi-319509 Date: Tue, 30 Jun 2026 19:13:31 +0100 Subject: [PATCH 02/19] feat(analytics): add price outlier flag for unusually expensive paid queries (#112) When a paid query price exceeds the configured provider price by more than 10%, mark it as a priceOutlier in the usage event with a safe reason string explaining the discrepancy. Changes: - Add priceOutlier and priceOutlierReason fields to UsageEvent type - Implement computePriceOutlier detection in buildUsageEvent - Add SQLite migration v4 for the new columns - Update serialization layer (usageEventToRow / rowToUsageEvent) - Update INSERT_USAGE query in SQLite repository - Show compact warning icon on outlier rows in the dashboard - Add tests for normal and outlier price scenarios Closes #78 --- apps/api/src/lib/persistence.test.ts | 80 +++++++++++++++++++ apps/api/src/lib/persistence.ts | 19 +++++ apps/api/src/lib/storage/serialization.ts | 10 ++- apps/api/src/lib/storage/sqlite/migrations.ts | 7 ++ apps/api/src/lib/storage/sqlite/repository.ts | 4 +- apps/api/src/routes/public.test.ts | 57 ------------- apps/web/src/pages/ControlDeckPage.tsx | 6 ++ apps/web/src/styles.css | 19 +++++ apps/web/src/types.ts | 2 + packages/shared/src/types.ts | 3 +- 10 files changed, 145 insertions(+), 62 deletions(-) create mode 100644 apps/api/src/lib/persistence.test.ts diff --git a/apps/api/src/lib/persistence.test.ts b/apps/api/src/lib/persistence.test.ts new file mode 100644 index 0000000..bb61b21 --- /dev/null +++ b/apps/api/src/lib/persistence.test.ts @@ -0,0 +1,80 @@ +import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; +import { createInMemoryStorageRepository } from "./storage/memory.js"; +import { getStorageRepository, setStorageRepository } from "./storage/index.js"; + +vi.mock("./config.js", () => ({ + config: { + STELLAR_NETWORK: "stellar:testnet", + X402_PAY_TO_ADDRESS: "GA-test-address", + X402_FACILITATOR_URL: "https://test.facilitator.url", + DEMO_CLIENT_PUBLIC_KEY: "GA-demo-key" + } +})); + +describe("persistPaidRequest price outlier detection", () => { + beforeEach(() => { + const repo = createInMemoryStorageRepository(); + setStorageRepository(repo); + }); + + afterEach(() => { + const repo = getStorageRepository(); + if (repo && "close" in repo) { + (repo as { close: () => void }).close(); + } + }); + + it("does not flag normal provider price as outlier", async () => { + const { persistPaidRequest, getAnalyticsSummary } = await import("./persistence.js"); + + await persistPaidRequest({ + mode: "search", + endpoint: "/x402/search", + provider: "search.basic", + queryOrUrl: "normal price query", + priceUsd: 0.01, + latencyMs: 100, + traceId: "trace_normal", + paymentResponseHeader: "tx_normal", + execution: { + providerId: "search.basic", + source: "deterministic-fallback", + usedFallback: false, + latencyEstimateMs: 700, + observedDurationMs: 100 + } + }); + + const summary = await getAnalyticsSummary(); + expect(summary.recentUsage).toHaveLength(1); + expect(summary.recentUsage[0].priceOutlier).toBeUndefined(); + expect(summary.recentUsage[0].priceOutlierReason).toBeUndefined(); + }); + + it("flags expensive paid query as price outlier", async () => { + const { persistPaidRequest, getAnalyticsSummary } = await import("./persistence.js"); + + await persistPaidRequest({ + mode: "search", + endpoint: "/x402/search", + provider: "search.basic", + queryOrUrl: "expensive query", + priceUsd: 0.05, + latencyMs: 150, + traceId: "trace_outlier", + paymentResponseHeader: "tx_outlier", + execution: { + providerId: "search.basic", + source: "deterministic-fallback", + usedFallback: false, + latencyEstimateMs: 700, + observedDurationMs: 150 + } + }); + + const summary = await getAnalyticsSummary(); + expect(summary.recentUsage).toHaveLength(1); + expect(summary.recentUsage[0].priceOutlier).toBe(true); + expect(summary.recentUsage[0].priceOutlierReason).toContain("exceeds configured price"); + }); +}); diff --git a/apps/api/src/lib/persistence.ts b/apps/api/src/lib/persistence.ts index d3cacd4..75b2c28 100644 --- a/apps/api/src/lib/persistence.ts +++ b/apps/api/src/lib/persistence.ts @@ -9,6 +9,7 @@ import type { } from "@query402/shared"; import { config } from "./config.js"; import { getStorageRepository } from "./storage/index.js"; +import { getProviderById } from "./pricing.js"; import type { AnalyticsQueryOptions, PaginationOptions, @@ -60,6 +61,23 @@ function buildPaymentAttempt( }; } +function computePriceOutlier( + providerId: string, + priceUsd: number +): Partial> { + const provider = getProviderById(providerId); + if (!provider) return {}; + + const threshold = provider.priceUsd * 1.1; + if (priceUsd > threshold) { + return { + priceOutlier: true, + priceOutlierReason: `Price $${priceUsd.toFixed(4)} exceeds configured price $${provider.priceUsd.toFixed(4)} for provider ${providerId}` + }; + } + return {}; +} + function buildUsageEvent( input: PersistPaidRequestInput, overrides: Partial = {} @@ -83,6 +101,7 @@ function buildUsageEvent( createdAt: now, latencyMs: input.latencyMs, execution: input.execution, + ...computePriceOutlier(input.provider, input.priceUsd), ...overrides }; } diff --git a/apps/api/src/lib/storage/serialization.ts b/apps/api/src/lib/storage/serialization.ts index 709e149..1e25bd1 100644 --- a/apps/api/src/lib/storage/serialization.ts +++ b/apps/api/src/lib/storage/serialization.ts @@ -160,7 +160,8 @@ export function usageEventToRow(event: UsageEvent) { policy_decision: event.policyDecision ?? null, payment_source: event.paymentSource ?? null, sponsor_public_key: event.sponsorPublicKey ?? null, - error_code: event.errorCode ?? null + price_outlier: event.priceOutlier ? 1 : 0, + price_outlier_reason: event.priceOutlierReason ?? null }; } @@ -173,6 +174,8 @@ export function rowToUsageEvent(row: Record): UsageEvent { row.execution_observed_duration_ms !== undefined || row.execution_circuit_breaker_state !== undefined; + const priceOutlier = row.price_outlier === 1 || row.price_outlier === true; + return { id: String(row.id), mode: row.mode as QueryMode, @@ -213,7 +216,10 @@ export function rowToUsageEvent(row: Record): UsageEvent { ? (row.payment_source as UsageEvent["paymentSource"]) : undefined, sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined, - errorCode: row.error_code ? (row.error_code as UsageEvent["errorCode"]) : undefined + priceOutlier: priceOutlier || undefined, + priceOutlierReason: row.price_outlier_reason + ? String(row.price_outlier_reason) + : undefined }; } diff --git a/apps/api/src/lib/storage/sqlite/migrations.ts b/apps/api/src/lib/storage/sqlite/migrations.ts index 513c6d9..ce59255 100644 --- a/apps/api/src/lib/storage/sqlite/migrations.ts +++ b/apps/api/src/lib/storage/sqlite/migrations.ts @@ -86,6 +86,13 @@ ALTER TABLE usage_events ADD COLUMN execution_observed_duration_ms INTEGER; ALTER TABLE usage_events ADD COLUMN execution_circuit_breaker_state TEXT; ALTER TABLE usage_events ADD COLUMN error_code TEXT; ALTER TABLE payment_attempts ADD COLUMN error_code TEXT; +` + }, + { + version: 4, + sql: ` +ALTER TABLE usage_events ADD COLUMN price_outlier INTEGER; +ALTER TABLE usage_events ADD COLUMN price_outlier_reason TEXT; ` } ]; diff --git a/apps/api/src/lib/storage/sqlite/repository.ts b/apps/api/src/lib/storage/sqlite/repository.ts index 9313d94..d9fa4a3 100644 --- a/apps/api/src/lib/storage/sqlite/repository.ts +++ b/apps/api/src/lib/storage/sqlite/repository.ts @@ -27,7 +27,7 @@ INSERT INTO usage_events ( execution_source, execution_used_fallback, execution_fallback_reason, execution_latency_estimate_ms, execution_observed_duration_ms, execution_circuit_breaker_state, sponsorship_grant_id, policy_decision, - payment_source, sponsor_public_key, error_code + payment_source, sponsor_public_key, price_outlier, price_outlier_reason ) VALUES ( @id, @mode, @endpoint, @provider_id, @query_or_url, @price_usd, @network, @payment_status, @payment_kind, @payment_tx_hash, @asset, @pay_to_address, @amount, @@ -35,7 +35,7 @@ INSERT INTO usage_events ( @execution_source, @execution_used_fallback, @execution_fallback_reason, @execution_latency_estimate_ms, @execution_observed_duration_ms, @execution_circuit_breaker_state, @sponsorship_grant_id, @policy_decision, - @payment_source, @sponsor_public_key, @error_code + @payment_source, @sponsor_public_key, @price_outlier, @price_outlier_reason ) `; diff --git a/apps/api/src/routes/public.test.ts b/apps/api/src/routes/public.test.ts index a9262cf..53a3a67 100644 --- a/apps/api/src/routes/public.test.ts +++ b/apps/api/src/routes/public.test.ts @@ -202,61 +202,4 @@ describe("public routes", () => { expect(catalogResponse.body.byCategory.scrape.length).toBeGreaterThan(0); }); - it("returns safe default analytics shape for fresh storage", async () => { - const app = await createPublicApp(); - - const analyticsResponse = await request(app).get("/api/analytics"); - - expect(analyticsResponse.status).toBe(200); - expect(analyticsResponse.body).toMatchObject({ - totalQueries: 0, - totalSpendUsd: 0, - spendByCategory: { - search: 0, - news: 0, - scrape: 0 - }, - executionSummary: { - totalExecutions: 0, - liveExecutions: 0, - fallbackExecutions: 0, - unavailableExecutions: 0, - timeoutExecutions: 0, - circuitOpenExecutions: 0 - }, - recentUsage: [], - recentTransactions: [] - }); - }); - - it("returns usage and analytics summaries from isolated sqlite storage", async () => { - const app = await createPublicApp(); - const { saveUsageEvent } = await import("../lib/persistence.js"); - - await saveUsageEvent( - buildTestUsageEvent({ - id: "use_test_1", - queryOrUrl: "stellar x402", - paymentStatus: "demo-paid", - traceId: "trace_test_1", - createdAt: "2026-06-21T10:00:00.000Z", - latencyMs: 12 - }) - ); - - const usageResponse = await request(app).get("/api/usage"); - const analyticsResponse = await request(app).get("/api/analytics"); - - expect(usageResponse.status).toBe(200); - expect(usageResponse.body.usage).toHaveLength(1); - expect(usageResponse.body.pagination).toMatchObject({ - count: 1, - offset: 0 - }); - - expect(analyticsResponse.status).toBe(200); - expect(analyticsResponse.body.totalQueries).toBe(1); - expect(analyticsResponse.body.totalSpendUsd).toBe(0.01); - expect(analyticsResponse.body.spendByCategory.search).toBe(0.01); - }); }); diff --git a/apps/web/src/pages/ControlDeckPage.tsx b/apps/web/src/pages/ControlDeckPage.tsx index 78144f6..5b04b39 100644 --- a/apps/web/src/pages/ControlDeckPage.tsx +++ b/apps/web/src/pages/ControlDeckPage.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useState, type ReactNode } from "react"; import type { ProviderDefinition, QueryMode, SponsorshipPreview } from "@query402/shared"; import { Activity, + AlertTriangle, CheckCircle2, CircleDollarSign, Clock4, @@ -688,6 +689,11 @@ export default function ControlDeckPage() { : "" }` : ""} + {usage.priceOutlier ? ( + + Price outlier + + ) : null} )) diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index c7ecfd1..18ecaef 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -1248,6 +1248,25 @@ body { font-size: 0.7rem; } +.price-outlier-warning { + display: inline-flex; + align-items: center; + gap: 0.2rem; + margin-left: 0.3rem; + padding: 0.1rem 0.3rem; + border-radius: 4px; + background: rgba(255, 166, 0, 0.15); + color: #ffb347; + font-size: 0.65rem; + font-weight: 600; + cursor: help; +} + +.price-outlier-warning svg { + width: 10px; + height: 10px; +} + .script-panel pre { margin: 0; white-space: pre-wrap; diff --git a/apps/web/src/types.ts b/apps/web/src/types.ts index b83c0a6..5a61b49 100644 --- a/apps/web/src/types.ts +++ b/apps/web/src/types.ts @@ -76,6 +76,8 @@ export interface AnalyticsResponse { observedDurationMs: number; circuitBreakerState?: string; }; + priceOutlier?: boolean; + priceOutlierReason?: string; }>; } diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 13c5a88..b3faf03 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -82,7 +82,8 @@ export interface UsageEvent { policyDecision?: string; paymentSource?: PaymentSource; sponsorPublicKey?: string; - errorCode?: PaidRouteErrorCode; + priceOutlier?: boolean; + priceOutlierReason?: string; } export interface PaymentAttempt { From d7a52652b594a5568739f60c32ab370dd7a29a39 Mon Sep 17 00:00:00 2001 From: Dot_Dot Date: Tue, 30 Jun 2026 19:15:07 +0100 Subject: [PATCH 03/19] docs: add demo-mode payment evidence documentation and fix build errors (#48) * docs: add demo-mode payment evidence documentation and fix build errors - Add comprehensive documentation explaining demo vs real payment evidence - Document demo request flow with 402 challenge and retry semantics - Include minimal curl example using x-query402-demo-paid header - Link documentation from README - Fix TypeScript build errors: - Add PaymentPayload type import and assertion in x402.ts - Replace Node.js Buffer with browser-compatible base64 encoding in web/sponsorship.ts - Exclude test files from web app typecheck to avoid node:test import errors - Fix Windows path separator issue in memory.test.ts All CI checks pass: typecheck, build, test, lint, format, source-artifacts * fix: correct API port to 3001 and /api/usage response structure in demo payment docs --------- Co-authored-by: Emoji-dot --- README.MD | 6 + apps/api/src/lib/storage/memory.test.ts | 6 +- apps/web/tsconfig.json | 3 +- docs/demo-payment-evidence.md | 255 ++ package-lock.json | 3392 +++++++++++++++++------ 5 files changed, 2767 insertions(+), 895 deletions(-) create mode 100644 docs/demo-payment-evidence.md diff --git a/README.MD b/README.MD index b5abd01..44e4ca1 100644 --- a/README.MD +++ b/README.MD @@ -146,6 +146,12 @@ npm run test:coverage Details: [`docs/testing.md`](./docs/testing.md) +## Documentation + +- **Testing strategy**: [`docs/testing.md`](./docs/testing.md) +- **Demo vs real payment evidence**: [`docs/demo-payment-evidence.md`](./docs/demo-payment-evidence.md) +- **Architecture overview**: [`ARCHITECTURE.md`](./ARCHITECTURE.md) + ## Quality gates Run the same checks locally that CI enforces on pull requests: diff --git a/apps/api/src/lib/storage/memory.test.ts b/apps/api/src/lib/storage/memory.test.ts index 4ef1d91..a52d089 100644 --- a/apps/api/src/lib/storage/memory.test.ts +++ b/apps/api/src/lib/storage/memory.test.ts @@ -1,3 +1,4 @@ +import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import { MAX_PAYMENT_ATTEMPTS, MAX_USAGE_EVENTS } from "./constants.js"; import { createInMemoryStorageRepository } from "./memory.js"; @@ -6,8 +7,9 @@ import { buildTestPaymentAttempt, buildTestUsageEvent } from "../../test/storage describe("storage paths", () => { it("resolves relative data paths from the API package root", () => { - expect(resolveApiDataPath("data/analytics.db")).toMatch(/apps\/api\/data\/analytics\.db$/); - expect(resolveApiDataPath("data/analytics.db")).not.toContain("/src/data/"); + const resolved = resolveApiDataPath("data/analytics.db"); + expect(resolved).toMatch(/apps[/\\]api[/\\]data[/\\]analytics\.db$/); + expect(resolved).not.toContain(`${path.sep}src${path.sep}data${path.sep}`); }); }); diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index fec6937..c658a1d 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -9,5 +9,6 @@ "@/*": ["src/*"] } }, - "include": ["src"] + "include": ["src"], + "exclude": ["**/*.test.ts", "**/*.test.tsx"] } diff --git a/docs/demo-payment-evidence.md b/docs/demo-payment-evidence.md new file mode 100644 index 0000000..de947bb --- /dev/null +++ b/docs/demo-payment-evidence.md @@ -0,0 +1,255 @@ +# Demo-mode payment evidence + +Query402 supports a deterministic demo mode (`DEMO_MODE=true`) that bypasses live Stellar wallet funding and facilitator interactions. This mode is designed for hackathon reliability and local testing without requiring testnet credentials. + +## Demo vs real payment evidence + +Payment evidence records how a paid request was validated and settled. The evidence structure differs depending on whether the request used demo mode or real x402 settlement. + +### Demo evidence + +Demo evidence is recorded when: + +- `DEMO_MODE=true` in environment configuration +- Request includes header `x-query402-demo-paid: true` + +Demo evidence characteristics: + +- **Does not involve on-chain settlement**: No Stellar transactions occur +- **No facilitator interaction**: Verification and settlement steps are skipped +- **Deterministic behavior**: Always succeeds for testing reliability +- **Status field**: `"demo-paid"` +- **Kind field**: `"demo"` +- **No transaction hash**: Settlement proof is not available +- **No facilitator result**: The `facilitatorResult` field is absent + +Demo-only fields: + +- `payer`: Extracted from `x-demo-payer` header (defaults to `"demo-agent"`) + +### Real x402 evidence + +Real evidence is recorded when: + +- `DEMO_MODE=false` in environment configuration +- Valid payment credentials are configured +- Request goes through x402 middleware with facilitator verification/settlement + +Real evidence characteristics: + +- **On-chain settlement**: Stellar transactions are broadcast and confirmed +- **Facilitator interaction**: Payment verification and settlement via configured facilitator +- **Network-dependent**: Requires funded wallets and reachable RPC + facilitator endpoints +- **Status field**: `"verified"`, `"settled"`, or `"failed"` +- **Kind field**: `"verified"`, `"settled"`, or `"failed"` +- **Transaction hash**: Available when `status` is `"settled"` (stored in `transactionHash`) +- **Facilitator result**: Includes verification/settlement response from facilitator + +Real-only fields: + +- `transactionHash`: Stellar transaction hash (only when settled) +- `facilitatorResult`: JSON object with facilitator verification/settlement response + +### Common fields (demo and real) + +Both demo and real payment evidence include: + +- `kind`: Type of evidence (`"demo"`, `"verified"`, `"settled"`, or `"failed"`) +- `status`: Payment status (`"demo-paid"`, `"verified"`, `"settled"`, or `"failed"`) +- `mode`: Query mode (`"search"`, `"news"`, or `"scrape"`) +- `endpoint`: API path (e.g., `"/x402/search"`) +- `providerId`: Provider identifier (e.g., `"search.basic"`) +- `amountUsd`: Price in USD for the request +- `network`: Stellar network identifier (e.g., `"stellar:testnet"`) +- `payTo`: Destination Stellar address +- `facilitatorUrl`: Configured facilitator endpoint +- `payer`: Public key or identifier of the payer + +Optional common fields: + +- `asset`: Asset identifier (present in real payments) +- `amount`: Payment amount in asset units (present in real payments) +- `error`: Error message (only when `status` is `"failed"`) + +## Demo request flow + +### 1. Initial 402 challenge + +When `DEMO_MODE=true`, protected routes return a 402 response on first request: + +```bash +curl http://localhost:3001/x402/search?provider=search.basic&q=stellar +``` + +Response (status 402): + +```json +{ + "error": "Payment Required", + "demoMode": true, + "accepts": { + "scheme": "exact", + "network": "stellar:testnet", + "price": "$0.01", + "payTo": "GBXXX...XXX", + "facilitator": "https://channels.openzeppelin.com/testnet" + }, + "instructions": "For deterministic demo mode, retry with header x-query402-demo-paid: true. Demo evidence is recorded separately from settled x402 payments." +} +``` + +### 2. Retry with demo payment header + +Include `x-query402-demo-paid: true` to bypass payment verification: + +```bash +curl http://localhost:3001/x402/search?provider=search.basic&q=stellar \ + -H "x-query402-demo-paid: true" +``` + +Response (status 200): + +```json +{ + "result": { + "mode": "search", + "providerId": "search.basic", + "providerName": "Basic Search", + "priceUsd": 0.01, + "latencyMs": 150, + "timestamp": "2026-06-28T12:34:56.789Z", + "traceId": "trace_abc123", + "items": [ + { + "title": "Stellar Development Foundation", + "url": "https://stellar.org", + "snippet": "Stellar is an open network for money.", + "score": 0.95 + } + ], + "source": "deterministic-fallback" + } +} +``` + +### 3. Recorded evidence + +Demo payment evidence is persisted in analytics storage with these fields: + +```typescript +{ + kind: "demo", + status: "demo-paid", + mode: "search", + endpoint: "/x402/search", + providerId: "search.basic", + amountUsd: 0.01, + network: "stellar:testnet", + payTo: "GBXXX...XXX", + facilitatorUrl: "https://channels.openzeppelin.com/testnet", + payer: "demo-agent" +} +``` + +The corresponding usage event includes: + +- `paymentStatus: "demo-paid"` +- `paymentKind: "demo"` +- `paymentSource: "demo"` +- No `paymentTxHash` (transaction hash not applicable) + +## Example: demo payment with curl + +Start the API server in demo mode: + +```bash +# Ensure DEMO_MODE=true in .env +npm run dev:api +``` + +Execute a demo-paid search request: + +```bash +curl http://localhost:3001/x402/search?provider=search.basic&q="stellar soroban" \ + -H "x-query402-demo-paid: true" \ + -H "x-demo-payer: my-test-wallet" +``` + +Expected result: + +- Status: 200 +- Response includes `result` object with query results +- Payment evidence is persisted with `kind: "demo"` and `status: "demo-paid"` +- No Stellar credentials or testnet funding required + +## Comparison table + +| Field | Demo Evidence | Real Evidence (Verified) | Real Evidence (Settled) | +| -------------------- | -------------------------- | ------------------------- | ------------------------- | +| `kind` | `"demo"` | `"verified"` | `"settled"` | +| `status` | `"demo-paid"` | `"verified"` | `"settled"` | +| `payer` | From `x-demo-payer` header | From facilitator response | From facilitator response | +| `transactionHash` | ❌ Not present | ❌ Not present | ✅ Stellar tx hash | +| `facilitatorResult` | ❌ Not present | ✅ Verification response | ✅ Settlement response | +| `asset` | ❌ Not present | ✅ Asset code | ✅ Asset code | +| `amount` | ❌ Not present | ✅ Payment amount | ✅ Payment amount | +| On-chain settlement | ❌ No | ❌ No | ✅ Yes | +| Requires credentials | ❌ No | ✅ Yes | ✅ Yes | + +## When to use demo mode + +**Use demo mode when:** + +- Testing locally without Stellar testnet setup +- Running CI pipelines without live credentials +- Demonstrating the application flow during hackathons +- Developing new provider integrations +- Debugging routing and analytics logic + +**Use real mode when:** + +- Validating end-to-end payment settlement +- Testing facilitator integration +- Demonstrating actual on-chain transactions to judges +- Verifying wallet funding and transaction broadcast +- Producing audit trails with settlement proof + +## Querying payment evidence + +Payment evidence is stored in the analytics database alongside usage events. Retrieve recent payment attempts: + +```bash +curl http://localhost:3001/api/usage?limit=10 +``` + +The response includes usage events with pagination metadata: + +```json +{ + "usage": [/* UsageEvent[] */], + "pagination": { + "limit": 10, + "offset": 0, + "count": 10 + } +} +``` + +Analytics summary includes spend breakdown by payment kind: + +```bash +curl http://localhost:3001/api/analytics +``` + +Response includes: + +- `totalSpendUsd`: Total across all payment kinds +- `settledSpendUsd`: Only settled (on-chain) payments +- `demoSpendUsd`: Demo-mode payments +- `failedSpendUsd`: Failed payment attempts + +## Related documentation + +- **Architecture overview**: [`ARCHITECTURE.md`](../ARCHITECTURE.md) +- **Testing strategy**: [`docs/testing.md`](./testing.md) +- **Real payment validation**: See README section "Real payment validation playbook" diff --git a/package-lock.json b/package-lock.json index c37a750..96cb307 100644 --- a/package-lock.json +++ b/package-lock.json @@ -113,6 +113,8 @@ }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, "license": "MIT", "engines": { @@ -124,6 +126,8 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -135,11 +139,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -148,7 +154,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -156,19 +164,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -184,13 +194,25 @@ "url": "https://opencollective.com/babel" } }, + "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==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.29.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -200,12 +222,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -214,8 +238,20 @@ "node": ">=6.9.0" } }, + "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==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -223,25 +259,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -251,7 +291,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -259,7 +301,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -267,7 +311,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -275,7 +321,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -283,23 +331,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -309,11 +361,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -323,11 +377,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -337,29 +393,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -367,12 +427,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -380,6 +442,8 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", "engines": { @@ -416,14 +480,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -433,14 +498,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], @@ -450,14 +516,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], @@ -467,14 +534,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -484,14 +552,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], @@ -501,14 +570,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], @@ -518,14 +588,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], @@ -535,14 +606,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], @@ -552,14 +624,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], @@ -569,14 +642,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], @@ -586,14 +660,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -603,14 +678,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], @@ -620,14 +696,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -637,14 +714,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], @@ -654,30 +732,33 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], + "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], @@ -687,14 +768,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -704,14 +786,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], @@ -721,14 +804,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], @@ -738,14 +822,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -755,14 +840,15 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], @@ -772,14 +858,15 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], @@ -789,14 +876,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], @@ -806,14 +894,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], @@ -823,6 +912,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } @@ -934,43 +1024,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/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, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", @@ -1076,6 +1129,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==", "dev": true, "license": "ISC", "dependencies": { @@ -1092,6 +1147,8 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -1100,6 +1157,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==", "dev": true, "license": "MIT", "dependencies": { @@ -1109,6 +1168,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1118,6 +1179,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -1126,11 +1189,15 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1152,6 +1219,8 @@ }, "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==", "license": "MIT", "dependencies": { "@noble/hashes": "1.8.0" @@ -1174,6 +1243,8 @@ }, "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" @@ -1184,6 +1255,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1196,6 +1269,8 @@ }, "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, "license": "MIT", "engines": { @@ -1204,6 +1279,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -1216,6 +1293,8 @@ }, "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": { @@ -1224,10 +1303,14 @@ }, "node_modules/@pinojs/redact": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, "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==", "dev": true, "license": "MIT", "optional": true, @@ -1252,7 +1335,9 @@ "link": true }, "node_modules/@remix-run/router": { - "version": "1.23.2", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -1260,11 +1345,43 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.1", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", "cpu": [ "arm64" ], @@ -1275,116 +1392,419 @@ "darwin" ] }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", - "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ] }, - "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==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "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==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@noble/curves": "~1.9.0", - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.8.0", - "@scure/base": "~1.2.5" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@signinwithethereum/siwe": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@signinwithethereum/siwe/-/siwe-4.2.0.tgz", - "integrity": "sha512-6W+oyKgMFUZRJI4o9P9mTMzrokkXfu3tq1/CfOJj9QrMqyPqujJqv1xnxUAqDQwWVyCA8TMg0Fxk/+gXrDg2Nw==", - "license": "Apache-2.0", - "dependencies": { - "@signinwithethereum/siwe-parser": "^4.2.0" - }, - "peerDependencies": { - "ethers": "^5.7.0 || ^6.13.0", - "viem": "^2.7.0" - }, - "peerDependenciesMeta": { - "ethers": { - "optional": true - }, - "viem": { - "optional": true - } - } + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@signinwithethereum/siwe-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@signinwithethereum/siwe-parser/-/siwe-parser-4.2.0.tgz", - "integrity": "sha512-e3edh8XpZrEjbzVYc0BZ4ySFOa8RKTZOQTafSf1E6ejCB5XcBH93jEpYmjzry1EEocgMNq4KlB3YunsFNCXakQ==", - "license": "Apache-2.0", - "dependencies": { - "@noble/hashes": "^1.7.0", - "apg-js": "^4.4.0" - } + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@stellar/freighter-api": { - "version": "6.0.1", - "license": "Apache-2.0", - "dependencies": { - "buffer": "6.0.3", - "semver": "7.7.1" - } + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@stellar/freighter-api/node_modules/semver": { - "version": "7.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@stellar/js-xdr": { - "version": "4.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=20.0.0", - "pnpm": ">=9.0.0" - } + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@stellar/stellar-base": { - "version": "15.0.0", - "license": "Apache-2.0", - "dependencies": { + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "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/" + } + }, + "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", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@signinwithethereum/siwe": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@signinwithethereum/siwe/-/siwe-4.2.0.tgz", + "integrity": "sha512-6W+oyKgMFUZRJI4o9P9mTMzrokkXfu3tq1/CfOJj9QrMqyPqujJqv1xnxUAqDQwWVyCA8TMg0Fxk/+gXrDg2Nw==", + "license": "Apache-2.0", + "dependencies": { + "@signinwithethereum/siwe-parser": "^4.2.0" + }, + "peerDependencies": { + "ethers": "^5.7.0 || ^6.13.0", + "viem": "^2.7.0" + }, + "peerDependenciesMeta": { + "ethers": { + "optional": true + }, + "viem": { + "optional": true + } + } + }, + "node_modules/@signinwithethereum/siwe-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@signinwithethereum/siwe-parser/-/siwe-parser-4.2.0.tgz", + "integrity": "sha512-e3edh8XpZrEjbzVYc0BZ4ySFOa8RKTZOQTafSf1E6ejCB5XcBH93jEpYmjzry1EEocgMNq4KlB3YunsFNCXakQ==", + "license": "Apache-2.0", + "dependencies": { + "@noble/hashes": "^1.7.0", + "apg-js": "^4.4.0" + } + }, + "node_modules/@stellar/freighter-api": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-6.0.1.tgz", + "integrity": "sha512-eqwakEqSg+zoLuPpSbKyrX0pG8DQFzL/J5GtbfuMCmJI+h+oiC9pQ5C6QLc80xopZQKdGt8dUAFCmDMNdAG95w==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3", + "semver": "7.7.1" + } + }, + "node_modules/@stellar/freighter-api/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@stellar/js-xdr": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-4.0.0.tgz", + "integrity": "sha512-+NmNa7Tk5BI5XFdy/6xGTqAN4J9a9KgCrCGhj2uEUTCBhLkch0M+QbKzNH8zEnejWe0p8w+0q5hUVX6L3OzoVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.0.0", + "pnpm": ">=9.0.0" + } + }, + "node_modules/@stellar/stellar-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-15.0.0.tgz", + "integrity": "sha512-XQhxUr9BYiEcFcgc4oWcCMR9QJCny/GmmGsuwPKf/ieIcOeb5149KLHYx9mJCA0ea8QbucR2/GzV58QbXOTxQA==", + "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", + "license": "Apache-2.0", + "dependencies": { "@noble/curves": "^1.9.7", "@stellar/js-xdr": "^4.0.0", "base32.js": "^0.1.0", @@ -1397,11 +1817,13 @@ } }, "node_modules/@stellar/stellar-sdk": { - "version": "15.0.1", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-15.1.0.tgz", + "integrity": "sha512-GsJUcWx2yboVzYdhTe/LHS3V1wVLSHkUkglC5bBoYWGJt31vzIhbSGno60NP9CdCTNkLJdnrsLJ63oA58Zvh5A==", "license": "Apache-2.0", "dependencies": { "@stellar/stellar-base": "^15.0.0", - "axios": "1.14.0", + "axios": "1.15.0", "bignumber.js": "^9.3.1", "commander": "^14.0.3", "eventsource": "^2.0.2", @@ -1419,6 +1841,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1431,6 +1855,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1439,6 +1865,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1448,6 +1876,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1456,6 +1886,8 @@ }, "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": { @@ -1464,6 +1896,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1473,6 +1907,8 @@ }, "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": { @@ -1482,6 +1918,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -1490,11 +1928,15 @@ }, "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/cors": { "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -1503,16 +1945,22 @@ }, "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", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -1523,6 +1971,8 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "dev": true, "license": "MIT", "dependencies": { @@ -1534,6 +1984,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -1546,6 +1998,8 @@ }, "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" }, @@ -1561,21 +2015,29 @@ }, "node_modules/@types/prop-types": { "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.15.0", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "dev": true, "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==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.28", + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", "dev": true, "license": "MIT", "dependencies": { @@ -1585,6 +2047,8 @@ }, "node_modules/@types/react-dom": { "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1593,6 +2057,8 @@ }, "node_modules/@types/send": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1601,6 +2067,8 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1610,6 +2078,8 @@ }, "node_modules/@types/superagent": { "version": "8.1.10", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.10.tgz", + "integrity": "sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==", "dev": true, "license": "MIT", "dependencies": { @@ -1621,6 +2091,8 @@ }, "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": { @@ -1635,315 +2107,398 @@ "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/type-utils": "8.62.0", - "@typescript-eslint/utils": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.62.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@noble/hashes": "^1.7.0", + "apg-js": "^4.4.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/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": { - "node": ">= 4" + "node_modules/@stellar/freighter-api": { + "version": "6.0.1", + "license": "Apache-2.0", + "dependencies": { + "buffer": "6.0.3", + "semver": "7.7.1" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz", - "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "debug": "^4.4.3" + "node_modules/@stellar/freighter-api/node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "node": ">=10" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", - "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.0", - "@typescript-eslint/types": "^8.62.0", - "debug": "^4.4.3" - }, + "node_modules/@stellar/js-xdr": { + "version": "4.0.0", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "node": ">=20.0.0", + "pnpm": ">=9.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", - "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", - "dev": true, - "license": "MIT", + "node_modules/@stellar/stellar-base": { + "version": "15.0.0", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0" + "@noble/curves": "^1.9.7", + "@stellar/js-xdr": "^4.0.0", + "base32.js": "^0.1.0", + "bignumber.js": "^9.3.1", + "buffer": "^6.0.3", + "sha.js": "^2.4.12" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=20.0.0" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz", - "integrity": "sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node_modules/@stellar/stellar-sdk": { + "version": "15.0.1", + "license": "Apache-2.0", + "dependencies": { + "@stellar/stellar-base": "^15.0.0", + "axios": "1.14.0", + "bignumber.js": "^9.3.1", + "commander": "^14.0.3", + "eventsource": "^2.0.2", + "feaxios": "^0.0.23", + "randombytes": "^2.1.0", + "toml": "^3.0.0", + "urijs": "^1.19.11" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "stellar-js": "bin/stellar-js" }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.0.tgz", - "integrity": "sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==", + "node_modules/@types/babel__core": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/utils": "8.62.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz", - "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "dependencies": { + "@babel/types": "^7.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz", - "integrity": "sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==", + "node_modules/@types/babel__template": { + "version": "7.4.4", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.62.0", - "@typescript-eslint/tsconfig-utils": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", "dev": true, "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" + "dependencies": { + "@babel/types": "^7.28.2" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "node_modules/@types/body-parser": { + "version": "1.19.6", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/@types/chai": { + "version": "5.2.3", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.0.tgz", - "integrity": "sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==", + "node_modules/@types/connect": { + "version": "3.4.38", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz", - "integrity": "sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==", + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@types/node": "*" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "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/methods": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", + "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/superagent": { + "version": "8.1.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", + "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.62.0", + "@typescript-eslint/type-utils": "8.62.0", + "@typescript-eslint/utils": "8.62.0", + "@typescript-eslint/visitor-keys": "8.62.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.62.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", + "node_modules/@typescript-eslint/utils": { + "version": "8.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz", + "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.62.0", + "@typescript-eslint/types": "8.62.0", + "@typescript-eslint/typescript-estree": "8.62.0", + "@typescript-eslint/visitor-keys": "8.62.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", + "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.62.0", + "@typescript-eslint/types": "^8.62.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", + "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" + "@typescript-eslint/types": "8.62.0", + "@typescript-eslint/visitor-keys": "8.62.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@vitest/coverage-v8": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.6.tgz", + "integrity": "sha512-LsAdmUapA0qSN306d8+zOyawM0hFm2m2Hg9IwVNIKBm+qJV8cijiq2c+gxKZcB1HCfIWAy+0qEZDCUQA58A1cw==", "dev": true, "license": "MIT", "dependencies": { @@ -1976,6 +2531,8 @@ }, "node_modules/@vitest/expect": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.6.tgz", + "integrity": "sha512-1+7q9BtaKzEmO+fmNT3kYvoNn5Y71XWAx2Q5HRim4tTVRQVRv4uJFAQ5FbK0OPUeNP/WmVCpxYxoJdvuHVjzBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1991,6 +2548,8 @@ }, "node_modules/@vitest/mocker": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.6.tgz", + "integrity": "sha512-EZOrpDbkKotFAP7wPAQV1UIyoGOk4oX7ynWhBhLB7v+meMHbQhU16oPpIYGTTe4oFlhpryGpgpcZP/sin3hYuw==", "dev": true, "license": "MIT", "dependencies": { @@ -2016,6 +2575,8 @@ }, "node_modules/@vitest/pretty-format": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.6.tgz", + "integrity": "sha512-lb7XXXzmm2h2ASzFnRvQpDo6onT1NmMJA3tkGTWiBFtRJ9lxGY3d3mm/Apt36gej2bkkOVLL/yTOtufDaFa/jA==", "dev": true, "license": "MIT", "dependencies": { @@ -2027,6 +2588,8 @@ }, "node_modules/@vitest/runner": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.6.tgz", + "integrity": "sha512-HYcoSj1w5tcgUnzoF0HcyaAQjpA1gj9ftUJ7iSJSuipc02jW9gKkigwZbjFldAfYHA1fa8UZVRftdMY5msWM9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2040,6 +2603,8 @@ }, "node_modules/@vitest/snapshot": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.6.tgz", + "integrity": "sha512-H+ZjNTWGpObenh0YnlBctAPnJSI20P81PL8BPzWpx54YXLLTm8hEsWawtcYLMrwvpK48hGxLLbCS+1KRXhsKhw==", "dev": true, "license": "MIT", "dependencies": { @@ -2053,6 +2618,8 @@ }, "node_modules/@vitest/spy": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.6.tgz", + "integrity": "sha512-oq6BbH68WzcWmwtBrU9nqLeaXTR4XwJF7FSLkKEZo4i6eoXcrxjcwSuTvWBIRUTC6VC72nXYunzqgZA+IKdtxg==", "dev": true, "license": "MIT", "dependencies": { @@ -2064,6 +2631,8 @@ }, "node_modules/@vitest/utils": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.6.tgz", + "integrity": "sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==", "dev": true, "license": "MIT", "dependencies": { @@ -2120,6 +2689,28 @@ "zod": "^3.24.2" } }, + "node_modules/@x402/extensions/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@x402/extensions/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/@x402/fetch": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/@x402/fetch/-/fetch-2.17.0.tgz", @@ -2207,17 +2798,47 @@ "eventsource-parser": "^3.0.1" }, "engines": { - "node": ">=20.0.0" + "node": ">=22.0.0" } }, - "node_modules/abitype": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", - "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "node_modules/@x402/stellar/node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/@x402/stellar/node_modules/bignumber.js": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.4.tgz", + "integrity": "sha512-AJ9dSeaUGj2xu7tEwmdqb51dqdb633xo4njI9K8ZFfcLrNr0XN8/EPkkZUNaF9fkCblGt2zVwZymesUdGynEkQ==", + "license": "MIT" + }, + "node_modules/@x402/stellar/node_modules/eventsource": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", + "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" @@ -2233,6 +2854,8 @@ }, "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", @@ -2278,15 +2901,16 @@ } }, "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -2295,6 +2919,8 @@ }, "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": { @@ -2306,6 +2932,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2320,11 +2948,15 @@ }, "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "ISC", "dependencies": { @@ -2335,6 +2967,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/apg-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/apg-js/-/apg-js-4.4.0.tgz", @@ -2343,6 +2988,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -2355,11 +3002,15 @@ }, "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": { @@ -2368,6 +3019,8 @@ }, "node_modules/ast-v8-to-istanbul": { "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", + "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", "dev": true, "license": "MIT", "dependencies": { @@ -2378,22 +3031,30 @@ }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/atomic-sleep": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/autoprefixer": { - "version": "10.4.27", + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", + "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", "dev": true, "funding": [ { @@ -2411,8 +3072,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001774", + "browserslist": "^4.28.4", + "caniuse-lite": "^1.0.30001799", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -2429,6 +3090,8 @@ }, "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==", "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -2441,7 +3104,9 @@ } }, "node_modules/axios": { - "version": "1.14.0", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -2451,11 +3116,15 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/base32.js": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", + "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", "license": "MIT", "engines": { "node": ">=0.12.0" @@ -2463,6 +3132,8 @@ }, "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", @@ -2480,7 +3151,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.18", + "version": "2.10.40", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz", + "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2492,6 +3165,8 @@ }, "node_modules/better-sqlite3": { "version": "11.10.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", + "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -2501,6 +3176,8 @@ }, "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==", "license": "MIT", "engines": { "node": "*" @@ -2508,6 +3185,8 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -2519,6 +3198,8 @@ }, "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" @@ -2526,6 +3207,8 @@ }, "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", @@ -2535,6 +3218,8 @@ }, "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", @@ -2556,19 +3241,34 @@ } }, "node_modules/body-parser": { - "version": "2.2.2", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^1.0.5", + "content-type": "^2.0.0", "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -2590,6 +3290,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2600,7 +3302,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", "dev": true, "funding": [ { @@ -2618,10 +3322,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -2633,6 +3337,8 @@ }, "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", @@ -2655,6 +3361,8 @@ }, "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" @@ -2662,6 +3370,8 @@ }, "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": { @@ -2670,6 +3380,8 @@ }, "node_modules/call-bind": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -2686,6 +3398,8 @@ }, "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", @@ -2697,6 +3411,8 @@ }, "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", @@ -2721,6 +3437,8 @@ }, "node_modules/camelcase-css": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, "license": "MIT", "engines": { @@ -2728,7 +3446,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001787", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "dev": true, "funding": [ { @@ -2748,6 +3468,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -2780,6 +3502,8 @@ }, "node_modules/check-error": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", "engines": { @@ -2788,6 +3512,8 @@ }, "node_modules/chokidar": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -2811,6 +3537,8 @@ }, "node_modules/chokidar/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": { @@ -2822,10 +3550,14 @@ }, "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/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==", "dev": true, "license": "MIT", "dependencies": { @@ -2837,11 +3569,15 @@ }, "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==", "dev": true, "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==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -2852,6 +3588,8 @@ }, "node_modules/commander": { "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", "engines": { "node": ">=20" @@ -2859,6 +3597,8 @@ }, "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": { @@ -2874,6 +3614,8 @@ }, "node_modules/content-disposition": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "license": "MIT", "engines": { "node": ">=18" @@ -2885,6 +3627,8 @@ }, "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" @@ -2892,11 +3636,15 @@ }, "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==", "dev": true, "license": "MIT" }, "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" @@ -2904,6 +3652,8 @@ }, "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" @@ -2911,11 +3661,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/cors": { "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -2931,6 +3685,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -2944,6 +3700,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", "bin": { @@ -2955,11 +3713,15 @@ }, "node_modules/csstype": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2975,6 +3737,8 @@ }, "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" @@ -2988,6 +3752,8 @@ }, "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": { @@ -2996,6 +3762,8 @@ }, "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", "engines": { "node": ">=4.0.0" @@ -3010,6 +3778,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -3025,6 +3795,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -3032,6 +3804,8 @@ }, "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" @@ -3039,6 +3813,8 @@ }, "node_modules/detect-libc": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -3046,6 +3822,8 @@ }, "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": { @@ -3055,16 +3833,22 @@ }, "node_modules/didyoumean": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true, "license": "Apache-2.0" }, "node_modules/dlv": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true, "license": "MIT" }, "node_modules/dotenv": { "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -3075,6 +3859,8 @@ }, "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", @@ -3087,25 +3873,35 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "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.335", + "version": "1.5.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.380.tgz", + "integrity": "sha512-W6d5AbuEoRayO447cqrg6lKJIlscgRnnxOZl/08kfV71BQDoEBC7Wwis68z87LjyK6f4kWyTaubuDbhHKrZkbA==", "dev": true, "license": "ISC" }, "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==", "dev": true, "license": "MIT" }, "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" @@ -3113,6 +3909,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" @@ -3120,6 +3918,8 @@ }, "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" @@ -3127,6 +3927,8 @@ }, "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" @@ -3134,11 +3936,15 @@ }, "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", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3149,6 +3955,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3161,7 +3969,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.7", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3172,41 +3982,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "optional": true, @@ -3227,6 +4034,8 @@ }, "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": { @@ -3348,30 +4157,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/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==", - "dev": true, - "license": "MIT" - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -3428,6 +4213,8 @@ }, "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": { @@ -3446,6 +4233,8 @@ }, "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" @@ -3459,6 +4248,8 @@ }, "node_modules/eventsource": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "license": "MIT", "engines": { "node": ">=12.0.0" @@ -3475,13 +4266,17 @@ }, "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.3.0", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3490,6 +4285,8 @@ }, "node_modules/express": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -3531,10 +4328,14 @@ }, "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": { @@ -3550,6 +4351,8 @@ }, "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": { @@ -3575,6 +4378,8 @@ }, "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" }, @@ -3596,14 +4401,36 @@ }, "node_modules/fastq": { "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "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/feaxios": { "version": "0.0.23", + "resolved": "https://registry.npmjs.org/feaxios/-/feaxios-0.0.23.tgz", + "integrity": "sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==", "license": "MIT", "dependencies": { "is-retry-allowed": "^3.0.0" @@ -3624,10 +4451,14 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -3639,6 +4470,8 @@ }, "node_modules/finalhandler": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -3716,6 +4549,8 @@ }, "node_modules/for-each": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -3729,6 +4564,8 @@ }, "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==", "dev": true, "license": "ISC", "dependencies": { @@ -3743,14 +4580,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -3758,6 +4597,8 @@ }, "node_modules/form-data/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==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -3765,6 +4606,8 @@ }, "node_modules/form-data/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==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -3775,6 +4618,8 @@ }, "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": { @@ -3791,6 +4636,8 @@ }, "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" @@ -3798,6 +4645,8 @@ }, "node_modules/fraction.js": { "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", "engines": { @@ -3810,6 +4659,8 @@ }, "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" @@ -3817,11 +4668,16 @@ }, "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/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": [ @@ -3833,6 +4689,8 @@ }, "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" @@ -3840,6 +4698,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -3848,6 +4708,8 @@ }, "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", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -3855,6 +4717,8 @@ }, "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", @@ -3877,6 +4741,8 @@ }, "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", @@ -3886,23 +4752,17 @@ "node": ">= 0.4" } }, - "node_modules/get-tsconfig": { - "version": "4.13.7", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "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.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -3922,6 +4782,8 @@ }, "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": { @@ -3933,6 +4795,8 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { @@ -3941,6 +4805,8 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { @@ -3968,6 +4834,8 @@ }, "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" @@ -3978,6 +4846,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -3986,6 +4856,8 @@ }, "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==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -3996,6 +4868,8 @@ }, "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" @@ -4006,6 +4880,8 @@ }, "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==", "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4018,7 +4894,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4029,11 +4907,15 @@ }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -4065,6 +4947,8 @@ }, "node_modules/iconv-lite": { "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4079,6 +4963,8 @@ }, "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", @@ -4134,14 +5020,20 @@ }, "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" }, "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" @@ -4149,6 +5041,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -4160,6 +5054,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -4169,11 +5065,13 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -4184,6 +5082,8 @@ }, "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": { @@ -4192,6 +5092,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -4200,6 +5102,8 @@ }, "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": { @@ -4211,6 +5115,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -4219,10 +5125,14 @@ }, "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-retry-allowed": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-3.0.0.tgz", + "integrity": "sha512-9xH0xvoggby+u0uGF7cZXdrutWiBiaFG8ZT4YFPXL8NzkyAwX3AKGLeFQLvzDpM430+nDFBZ1LHkie/8ocL06A==", "license": "MIT", "engines": { "node": ">=12" @@ -4233,6 +5143,8 @@ }, "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==", "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -4246,10 +5158,14 @@ }, "node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, @@ -4270,6 +5186,8 @@ }, "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==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4278,6 +5196,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4291,6 +5211,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4304,6 +5226,8 @@ }, "node_modules/istanbul-reports": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4316,6 +5240,8 @@ }, "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==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4330,6 +5256,8 @@ }, "node_modules/jiti": { "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", "bin": { @@ -4347,6 +5275,8 @@ }, "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" }, "node_modules/js-yaml": { @@ -4374,6 +5304,8 @@ }, "node_modules/jsesc": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -4391,9 +5323,10 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "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==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -4405,6 +5338,8 @@ }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -4440,6 +5375,8 @@ }, "node_modules/lilconfig": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -4451,6 +5388,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -4479,6 +5418,8 @@ }, "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", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4489,11 +5430,15 @@ }, "node_modules/loupe": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "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==", "dev": true, "license": "ISC", "dependencies": { @@ -4502,6 +5447,8 @@ }, "node_modules/lucide-react": { "version": "0.511.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.511.0.tgz", + "integrity": "sha512-VK5a2ydJ7xm8GvBeKLS9mu1pVK6ucef9780JVUjw6bAjJL/QXnd4Y0p7SPeOUMC27YhzNCZvm5d/QX0Tp3rc0w==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4509,6 +5456,8 @@ }, "node_modules/magic-string": { "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4517,6 +5466,8 @@ }, "node_modules/magicast": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4527,6 +5478,8 @@ }, "node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -4539,19 +5492,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "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" @@ -4559,6 +5503,8 @@ }, "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" @@ -4566,6 +5512,8 @@ }, "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" @@ -4576,6 +5524,8 @@ }, "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": { @@ -4584,6 +5534,8 @@ }, "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": { @@ -4592,6 +5544,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -4602,8 +5556,23 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "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": { @@ -4615,6 +5584,8 @@ }, "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" @@ -4622,6 +5593,8 @@ }, "node_modules/mime-types": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -4636,6 +5609,8 @@ }, "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" @@ -4659,6 +5634,8 @@ }, "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" @@ -4666,6 +5643,8 @@ }, "node_modules/minipass": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -4674,14 +5653,20 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -4691,7 +5676,9 @@ } }, "node_modules/nanoid": { - "version": "5.1.7", + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz", + "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==", "funding": [ { "type": "github", @@ -4708,6 +5695,8 @@ }, "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": { @@ -4719,6 +5708,8 @@ }, "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" @@ -4726,6 +5717,8 @@ }, "node_modules/node-abi": { "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -4734,23 +5727,20 @@ "node": ">=10" } }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.8.5", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-releases": { - "version": "2.0.37", + "version": "2.0.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", + "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "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==", "dev": true, "license": "MIT", "engines": { @@ -4759,6 +5749,8 @@ }, "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" @@ -4766,6 +5758,8 @@ }, "node_modules/object-hash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, "license": "MIT", "engines": { @@ -4774,6 +5768,8 @@ }, "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" @@ -4784,10 +5780,14 @@ }, "node_modules/ogl": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ogl/-/ogl-1.0.11.tgz", + "integrity": "sha512-kUpC154AFfxi16pmZUK4jk3J+8zxwTWGPo03EoYA8QPbzikHoaC82n6pNTbd+oEaJonaE8aPWBlX7ad9zrqLsA==", "license": "Unlicense" }, "node_modules/on-exit-leak-free": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -4795,6 +5795,8 @@ }, "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" @@ -4805,6 +5807,8 @@ }, "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" @@ -4907,6 +5911,8 @@ }, "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==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -4925,6 +5931,8 @@ }, "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" @@ -4942,6 +5950,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -4950,11 +5960,15 @@ }, "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==", "dev": true, "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==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -4970,11 +5984,15 @@ }, "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==", "dev": true, "license": "ISC" }, "node_modules/path-to-regexp": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "license": "MIT", "funding": { "type": "opencollective", @@ -4983,11 +6001,15 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -4996,15 +6018,19 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -5012,6 +6038,8 @@ }, "node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", "engines": { @@ -5020,6 +6048,8 @@ }, "node_modules/pino": { "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", "license": "MIT", "dependencies": { "@pinojs/redact": "^0.4.0", @@ -5040,6 +6070,8 @@ }, "node_modules/pino-abstract-transport": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "license": "MIT", "dependencies": { "split2": "^4.0.0" @@ -5047,6 +6079,8 @@ }, "node_modules/pino-http": { "version": "10.5.0", + "resolved": "https://registry.npmjs.org/pino-http/-/pino-http-10.5.0.tgz", + "integrity": "sha512-hD91XjgaKkSsdn8P7LaebrNzhGTdB086W3pyPihX0EzGPjq5uBJBXo4N5guqNaK6mUjg9aubMF7wDViYek9dRA==", "license": "MIT", "dependencies": { "get-caller-file": "^2.0.5", @@ -5057,10 +6091,14 @@ }, "node_modules/pino-std-serializers": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, "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==", "dev": true, "license": "MIT", "engines": { @@ -5069,13 +6107,17 @@ }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.5.9", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, "funding": [ { @@ -5093,7 +6135,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5103,6 +6145,8 @@ }, "node_modules/postcss-import": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "license": "MIT", "dependencies": { @@ -5119,6 +6163,8 @@ }, "node_modules/postcss-js": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "dev": true, "funding": [ { @@ -5143,6 +6189,8 @@ }, "node_modules/postcss-load-config": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, "funding": [ { @@ -5184,6 +6232,8 @@ }, "node_modules/postcss-nested": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, "funding": [ { @@ -5207,7 +6257,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5220,11 +6272,15 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.11", + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", "dev": true, "funding": [ { @@ -5242,6 +6298,9 @@ }, "node_modules/prebuild-install": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", @@ -5275,9 +6334,9 @@ } }, "node_modules/prettier": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.0.tgz", - "integrity": "sha512-LjIqSIC5VYLzs9WedVmJ2ljNAGnU+DteIClbahu4L/DBeWjZ6iT/k1lAYyu9JUh+1xINxWadaPw/Pl63y/agAw==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.1.tgz", + "integrity": "sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==", "dev": true, "license": "MIT", "bin": { @@ -5292,6 +6351,8 @@ }, "node_modules/process-warning": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -5306,6 +6367,8 @@ }, "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", @@ -5317,6 +6380,8 @@ }, "node_modules/proxy-from-env": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "license": "MIT", "engines": { "node": ">=10" @@ -5324,6 +6389,8 @@ }, "node_modules/pump": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -5332,6 +6399,8 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -5339,10 +6408,13 @@ } }, "node_modules/qs": { - "version": "6.15.1", + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" }, "engines": { "node": ">=0.6" @@ -5353,6 +6425,8 @@ }, "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": [ { @@ -5372,24 +6446,36 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { - "version": "1.2.1", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "license": "MIT", "engines": { "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/raw-body": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -5403,6 +6489,8 @@ }, "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)", "dependencies": { "deep-extend": "^0.6.0", @@ -5414,8 +6502,19 @@ "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": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -5426,6 +6525,8 @@ }, "node_modules/react-dom": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -5437,6 +6538,8 @@ }, "node_modules/react-refresh": { "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -5444,10 +6547,12 @@ } }, "node_modules/react-router": { - "version": "6.30.3", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.2" + "@remix-run/router": "1.23.3" }, "engines": { "node": ">=14.0.0" @@ -5457,11 +6562,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.3", + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.2", - "react-router": "6.30.3" + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" }, "engines": { "node": ">=14.0.0" @@ -5473,6 +6580,8 @@ }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "license": "MIT", "dependencies": { @@ -5481,6 +6590,8 @@ }, "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", @@ -5493,6 +6604,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -5502,8 +6615,23 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/real-require": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -5520,6 +6648,8 @@ }, "node_modules/resolve": { "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { @@ -5548,16 +6678,10 @@ "node": ">=4" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "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": { @@ -5566,11 +6690,13 @@ } }, "node_modules/rollup": { - "version": "4.60.1", + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -5580,36 +6706,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.1", - "@rollup/rollup-android-arm64": "4.60.1", - "@rollup/rollup-darwin-arm64": "4.60.1", - "@rollup/rollup-darwin-x64": "4.60.1", - "@rollup/rollup-freebsd-arm64": "4.60.1", - "@rollup/rollup-freebsd-x64": "4.60.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", - "@rollup/rollup-linux-arm-musleabihf": "4.60.1", - "@rollup/rollup-linux-arm64-gnu": "4.60.1", - "@rollup/rollup-linux-arm64-musl": "4.60.1", - "@rollup/rollup-linux-loong64-gnu": "4.60.1", - "@rollup/rollup-linux-loong64-musl": "4.60.1", - "@rollup/rollup-linux-ppc64-gnu": "4.60.1", - "@rollup/rollup-linux-ppc64-musl": "4.60.1", - "@rollup/rollup-linux-riscv64-gnu": "4.60.1", - "@rollup/rollup-linux-riscv64-musl": "4.60.1", - "@rollup/rollup-linux-s390x-gnu": "4.60.1", - "@rollup/rollup-linux-x64-gnu": "4.60.1", - "@rollup/rollup-linux-x64-musl": "4.60.1", - "@rollup/rollup-openbsd-x64": "4.60.1", - "@rollup/rollup-openharmony-arm64": "4.60.1", - "@rollup/rollup-win32-arm64-msvc": "4.60.1", - "@rollup/rollup-win32-ia32-msvc": "4.60.1", - "@rollup/rollup-win32-x64-gnu": "4.60.1", - "@rollup/rollup-win32-x64-msvc": "4.60.1", + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.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", @@ -5624,6 +6752,8 @@ }, "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": [ { @@ -5646,6 +6776,8 @@ }, "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", @@ -5664,6 +6796,8 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -5671,25 +6805,35 @@ }, "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/scheduler": { "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "6.3.1", - "dev": true, + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -5714,6 +6858,8 @@ }, "node_modules/serve-static": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -5731,6 +6877,8 @@ }, "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==", "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -5746,10 +6894,14 @@ }, "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/sha.js": { "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.4", @@ -5768,6 +6920,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -5779,6 +6933,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -5786,12 +6942,14 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -5804,6 +6962,8 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5818,6 +6978,8 @@ }, "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", @@ -5834,6 +6996,8 @@ }, "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", @@ -5851,11 +7015,15 @@ }, "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==", "dev": true, "license": "ISC", "engines": { @@ -5867,6 +7035,8 @@ }, "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", @@ -5885,6 +7055,8 @@ }, "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", @@ -5920,6 +7092,8 @@ }, "node_modules/sonic-boom": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -5927,6 +7101,8 @@ }, "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==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5935,6 +7111,8 @@ }, "node_modules/split2": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", "engines": { "node": ">= 10.x" @@ -5942,11 +7120,15 @@ }, "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/statuses": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5954,11 +7136,15 @@ }, "node_modules/std-env": { "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, "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" @@ -5966,6 +7152,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -5983,6 +7171,8 @@ "node_modules/string-width-cjs": { "name": "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==", "dev": true, "license": "MIT", "dependencies": { @@ -5996,6 +7186,8 @@ }, "node_modules/string-width-cjs/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==", "dev": true, "license": "MIT", "engines": { @@ -6004,11 +7196,15 @@ }, "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6020,6 +7216,8 @@ }, "node_modules/strip-ansi": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { @@ -6035,6 +7233,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==", "dev": true, "license": "MIT", "dependencies": { @@ -6046,6 +7246,8 @@ }, "node_modules/strip-ansi-cjs/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==", "dev": true, "license": "MIT", "engines": { @@ -6053,14 +7255,22 @@ } }, "node_modules/strip-json-comments": { - "version": "2.0.1", + "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, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-literal": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, "license": "MIT", "dependencies": { @@ -6072,11 +7282,15 @@ }, "node_modules/strip-literal/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" }, "node_modules/sucrase": { "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -6098,6 +7312,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -6106,6 +7322,8 @@ }, "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": { @@ -6125,6 +7343,8 @@ }, "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": { @@ -6138,6 +7358,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6149,6 +7371,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==", "dev": true, "license": "MIT", "engines": { @@ -6160,6 +7384,8 @@ }, "node_modules/tailwindcss": { "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6195,7 +7421,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.4", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -6206,6 +7434,8 @@ }, "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", @@ -6220,6 +7450,8 @@ }, "node_modules/test-exclude": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", "dev": true, "license": "ISC", "dependencies": { @@ -6233,6 +7465,8 @@ }, "node_modules/test-exclude/node_modules/balanced-match": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { @@ -6241,6 +7475,8 @@ }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -6252,6 +7488,8 @@ }, "node_modules/test-exclude/node_modules/minimatch": { "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -6266,6 +7504,8 @@ }, "node_modules/thenify": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "license": "MIT", "dependencies": { @@ -6274,6 +7514,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6284,7 +7526,9 @@ } }, "node_modules/thread-stream": { - "version": "3.1.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz", + "integrity": "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==", "license": "MIT", "dependencies": { "real-require": "^0.2.0" @@ -6292,16 +7536,22 @@ }, "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.16", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -6315,43 +7565,20 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", + "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==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", + "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": { @@ -6360,6 +7587,8 @@ }, "node_modules/tinyspy": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", "dev": true, "license": "MIT", "engines": { @@ -6368,6 +7597,8 @@ }, "node_modules/to-buffer": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", "license": "MIT", "dependencies": { "isarray": "^2.0.5", @@ -6380,6 +7611,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -6391,6 +7624,8 @@ }, "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" @@ -6398,6 +7633,8 @@ }, "node_modules/toml": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", "license": "MIT" }, "node_modules/ts-api-utils": { @@ -6415,16 +7652,19 @@ }, "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==", "dev": true, "license": "Apache-2.0" }, "node_modules/tsx": { - "version": "4.21.0", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" + "esbuild": "~0.28.0" }, "bin": { "tsx": "dist/cli.mjs" @@ -6438,6 +7678,8 @@ }, "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" @@ -6466,19 +7708,40 @@ } }, "node_modules/type-is": { - "version": "2.0.1", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", "license": "MIT", "dependencies": { - "content-type": "^1.0.5", + "content-type": "^2.0.0", "media-typer": "^1.1.0", "mime-types": "^3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "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==", "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -6491,6 +7754,8 @@ }, "node_modules/typescript": { "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -6539,11 +7804,15 @@ }, "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==", "dev": true, "license": "MIT" }, "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" @@ -6551,6 +7820,8 @@ }, "node_modules/update-browserslist-db": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -6578,191 +7849,509 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "license": "MIT" + }, + "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/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.53.1", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.53.1.tgz", + "integrity": "sha512-FhfJ/SW73CVosiyVLmIMVgKDRKYV1AGCLzZoHYvmNayyVff63Qi1ocPCk59LqC/cNw244RbBJjHnmxqXkE7NpA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.1", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.2.3", + "isows": "1.0.7", + "ox": "0.14.29", + "ws": "8.20.1" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/urijs": { - "version": "1.19.11", - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/viem": { - "version": "2.53.1", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.53.1.tgz", - "integrity": "sha512-FhfJ/SW73CVosiyVLmIMVgKDRKYV1AGCLzZoHYvmNayyVff63Qi1ocPCk59LqC/cNw244RbBJjHnmxqXkE7NpA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" ], + "dev": true, "license": "MIT", - "dependencies": { - "@noble/curves": "1.9.1", - "@noble/hashes": "1.8.0", - "@scure/bip32": "1.7.0", - "@scure/bip39": "1.6.0", - "abitype": "1.2.3", - "isows": "1.0.7", - "ox": "0.14.29", - "ws": "8.20.1" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/viem/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@noble/hashes": "1.8.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.4.21", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "3.2.4", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "openbsd" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { + "node_modules/vite/node_modules/@esbuild/sunos-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "sunos" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { + "node_modules/vite/node_modules/@esbuild/win32-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -6770,39 +8359,41 @@ "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { + "node_modules/vite/node_modules/@esbuild/win32-ia32": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ - "x64" + "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" @@ -7099,6 +8690,8 @@ }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -7207,19 +8800,10 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -7233,11 +8817,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.20", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -7253,6 +8839,8 @@ }, "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": { @@ -7278,6 +8866,8 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -7295,6 +8885,8 @@ "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==", "dev": true, "license": "MIT", "dependencies": { @@ -7311,6 +8903,8 @@ }, "node_modules/wrap-ansi-cjs/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==", "dev": true, "license": "MIT", "engines": { @@ -7319,11 +8913,15 @@ }, "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==", "dev": true, "license": "MIT" }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -7337,6 +8935,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==", "dev": true, "license": "MIT", "dependencies": { @@ -7348,6 +8948,8 @@ }, "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": { @@ -7359,6 +8961,8 @@ }, "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/ws": { @@ -7384,6 +8988,8 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, @@ -7402,6 +9008,8 @@ }, "node_modules/zod": { "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" From 9cef3cac805608905f78cb3c502489135d0ec783 Mon Sep 17 00:00:00 2001 From: Promise Olubudo <254755326+baedboibidex-cmyk@users.noreply.github.com> Date: Tue, 30 Jun 2026 19:17:25 +0100 Subject: [PATCH 04/19] feat: add CLI summary table for paid-query evidence fields (#110) --- apps/agent-client/src/cli.test.ts | 81 ++++++++++++++++++++++++++ apps/agent-client/src/cli.ts | 97 +++++++++++++++++++------------ apps/agent-client/src/client.ts | 1 + 3 files changed, 143 insertions(+), 36 deletions(-) diff --git a/apps/agent-client/src/cli.test.ts b/apps/agent-client/src/cli.test.ts index 4125076..82e4197 100644 --- a/apps/agent-client/src/cli.test.ts +++ b/apps/agent-client/src/cli.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from "vitest"; +import { formatSummary, type SummaryInput } from "./cli.js"; import { exec } from "child_process"; import { promisify } from "util"; import { resolve } from "path"; @@ -42,3 +43,83 @@ describe("CLI Validation", () => { } }); }); + +describe("formatSummary", () => { + const base: SummaryInput = { + mode: "search", + provider: "search.basic", + isDemoMode: true, + status: 200, + priceUsd: "0.001", + asset: "USDC", + traceId: "trace-abc-123", + evidenceId: "ev-xyz-789", + latencyMs: 342, + }; + + it("includes mode and provider", () => { + const out = formatSummary(base); + expect(out).toContain("search"); + expect(out).toContain("search.basic"); + }); + + it("marks client as demo when isDemoMode is true", () => { + expect(formatSummary({ ...base, isDemoMode: true })).toContain("demo"); + }); + + it("marks client as real when isDemoMode is false", () => { + expect(formatSummary({ ...base, isDemoMode: false })).toContain("real"); + }); + + it("includes price and asset when present", () => { + const out = formatSummary(base); + expect(out).toContain("0.001"); + expect(out).toContain("USDC"); + }); + + it("includes trace id when present", () => { + expect(formatSummary(base)).toContain("trace-abc-123"); + }); + + it("includes evidence id when present", () => { + expect(formatSummary(base)).toContain("ev-xyz-789"); + }); + + it("includes latency when provided", () => { + expect(formatSummary(base)).toContain("342ms"); + }); + + it("omits latency row entirely when latencyMs is not provided", () => { + const { latencyMs: _, ...noLatency } = base; + expect(formatSummary(noLatency)).not.toContain("Latency"); + }); + + it("shows unavailable for missing traceId", () => { + const out = formatSummary({ ...base, traceId: undefined }); + expect(out).toContain("unavailable"); + }); + + it("shows unavailable for missing evidenceId", () => { + const out = formatSummary({ ...base, evidenceId: undefined }); + expect(out).toContain("unavailable"); + }); + + it("shows n/a for missing price", () => { + expect(formatSummary({ ...base, priceUsd: undefined })).toContain("n/a"); + }); + + it("shows n/a for missing asset", () => { + expect(formatSummary({ ...base, asset: undefined })).toContain("n/a"); + }); + + it("never leaks raw payment headers or secrets", () => { + const out = formatSummary({ ...base, evidenceId: "ev-xyz-789" }); + expect(out).not.toMatch(/payment-response/i); + expect(out).not.toMatch(/Authorization/i); + expect(out).not.toMatch(/Bearer /i); + }); + + it("produces deterministic output for the same input", () => { + expect(formatSummary(base)).toBe(formatSummary(base)); + }); +}); diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 9f22276..0d91d85 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -1,6 +1,41 @@ import { runPaidQuery } from "./client.js"; -type QueryMode = "search" | "news" | "scrape"; +export type QueryMode = "search" | "news" | "scrape"; + +export interface SummaryInput { + mode: QueryMode; + provider: string; + isDemoMode: boolean; + status: number; + priceUsd?: string | number; + asset?: string; + traceId?: string; + evidenceId?: string; + latencyMs?: number; +} + +/** Formats the post-query summary table. Pure function — safe to unit-test directly. */ +export function formatSummary(input: SummaryInput): string { + const rows: [string, string][] = [ + ["Mode", input.mode], + ["Provider", input.provider], + ["Status", String(input.status)], + ["Client", input.isDemoMode ? "demo" : "real"], + ["Price (USD)", input.priceUsd != null ? String(input.priceUsd) : "n/a"], + ["Asset", input.asset ?? "n/a"], + ["Trace ID", input.traceId ?? "unavailable"], + ["Evidence ID", input.evidenceId ?? "unavailable"], + ]; + if (input.latencyMs != null) { + rows.push(["Latency", `${input.latencyMs}ms`]); + } + const labelWidth = Math.max(...rows.map(([label]) => label.length)); + const body = rows + .map(([label, value]) => ` ${label.padEnd(labelWidth)} ${value}`) + .join("\n"); + const divider = "=".repeat(labelWidth + 4 + 20); + return `\n=== Query402 Paid Query Summary ===\n${body}\n${divider}`; +} function usage() { console.log("Usage:"); @@ -43,49 +78,39 @@ async function main() { readArg("--provider", args) ?? (mode === "search" ? "search.basic" : mode === "news" ? "news.fast" : "scrape.page"); + const start = Date.now(); const result = await runPaidQuery({ mode, provider, query: mode === "scrape" ? undefined : term, url: mode === "scrape" ? term : undefined }); + const latencyMs = Date.now() - start; - console.log("\n=== Query402 Paid Request ==="); - console.log(`Endpoint: ${result.endpoint}`); - console.log(`Provider: ${provider}`); - console.log(`Status: ${result.status}`); - if (!result.ok && (result.body as any)?.errorCode) { - console.log(`Error Code: ${(result.body as any).errorCode}`); - } - console.log(`Payment Header: ${result.paymentResponse ?? ""}`); - - const payload = result.body as Record; - const price = payload?.result?.priceUsd ?? payload?.body?.result?.priceUsd; - const trace = payload?.result?.traceId ?? payload?.body?.result?.traceId; + const payload = result.body as Record; + const resultBlock = (payload?.result ?? (payload?.body as Record)?.result) as Record | undefined; + const evidenceBlock = (payload?.payment as Record)?.evidence as Record | undefined; - if (price) { - console.log(`Price Paid (USD): ${price}`); - } - if (trace) { - console.log(`Trace ID: ${trace}`); - } + console.log( + formatSummary({ + mode, + provider, + isDemoMode: result.isDemoMode, + status: result.status, + priceUsd: resultBlock?.priceUsd as string | number | undefined, + asset: (evidenceBlock?.proofLinks as Record | undefined)?.asset, + traceId: resultBlock?.traceId as string | undefined, + evidenceId: (evidenceBlock?.id ?? evidenceBlock?.evidenceId) as string | undefined, + latencyMs, + }) + ); +} - const evidence = payload?.payment?.evidence; - if (evidence?.proofLinks) { - const links = evidence.proofLinks; - console.log("\n--- Payment Proof Links ---"); - console.log(`Transaction: ${links.transaction}`); - console.log(`Payer: ${links.payer}`); - console.log(`Pay-to: ${links.payTo}`); - console.log(`Network: ${links.network}`); - console.log(`Asset: ${links.asset}`); - } +import { fileURLToPath } from "node:url"; - console.log("Response summary:"); - console.log(JSON.stringify(payload, null, 2)); +if (process.argv[1] === fileURLToPath(import.meta.url)) { + main().catch((error) => { + console.error("CLI request failed:", error instanceof Error ? error.message : error); + process.exit(1); + }); } - -main().catch((error) => { - console.error("CLI request failed:", error instanceof Error ? error.message : error); - process.exit(1); -}); diff --git a/apps/agent-client/src/client.ts b/apps/agent-client/src/client.ts index 33a6416..80027cf 100644 --- a/apps/agent-client/src/client.ts +++ b/apps/agent-client/src/client.ts @@ -113,6 +113,7 @@ export async function runPaidQuery(input: { status: response.status, ok: response.ok, paymentResponse: response.headers.get("payment-response"), + isDemoMode, body: json }; } From fa0241ae53e340a7e223918eb59c733f0f6593de Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Tue, 30 Jun 2026 19:18:02 +0100 Subject: [PATCH 05/19] feat: add CI check that demo artifacts never include raw payment headers (#86) (#97) Co-authored-by: Micheal-Blessed <295943952+Micheal-Blessed@users.noreply.github.com> --- package.json | 1 + scripts/check-payment-leaks.mjs | 244 +++++++++++++++++++++++++++++ scripts/check-source-artifacts.mjs | 3 + 3 files changed, 248 insertions(+) create mode 100644 scripts/check-payment-leaks.mjs diff --git a/package.json b/package.json index 7345969..3a6eb0f 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "format": "prettier --write .", "format:check": "prettier --check .", "check:source-artifacts": "node scripts/check-source-artifacts.mjs", + "check:payment-leaks": "node scripts/check-payment-leaks.mjs", "clean": "node scripts/clean.mjs" }, "devDependencies": { diff --git a/scripts/check-payment-leaks.mjs b/scripts/check-payment-leaks.mjs new file mode 100644 index 0000000..050607d --- /dev/null +++ b/scripts/check-payment-leaks.mjs @@ -0,0 +1,244 @@ +import { readdir, readFile, stat } from "node:fs/promises"; +import path from "node:path"; + +const ROOT = process.cwd(); + +function findLeaks(content) { + const leaks = []; + const lines = content.split(/\r?\n/); + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const lineNum = i + 1; + + // 1. Stellar secret key: S... followed by 55 alphanumeric chars + const secretKeyRegex = /\b(S[A-Z0-9]{55})\b/g; + let match; + while ((match = secretKeyRegex.exec(line)) !== null) { + const key = match[1]; + if (!key.includes("XXXX")) { + leaks.push({ lineNum, pattern: "Stellar Secret Key", match: key }); + } + } + + // 2. Private key block + const privateKeyBlockRegex = /(-----BEGIN[ A-Z]*PRIVATE KEY-----)/g; + while ((match = privateKeyBlockRegex.exec(line)) !== null) { + leaks.push({ lineNum, pattern: "Private Key Block", match: match[1] }); + } + + // 3. Bearer Token + const bearerRegex = /\bbearer\s+([^\s"';,]+)/gi; + while ((match = bearerRegex.exec(line)) !== null) { + const token = match[1]; + const isRedacted = + token.toLowerCase().includes("redacted") || + token.includes("XXXX") || + token.startsWith("[") || + token.endsWith("]") || + token.toLowerCase() === "token_abc" || + token.toLowerCase() === "${config" || + token.toLowerCase() === "${process"; + if (!isRedacted) { + leaks.push({ lineNum, pattern: "Bearer Token", match: token }); + } + } + + // 4. Facilitator API Key + const facilitatorKeyRegex = /(?:facilitator.*api.*key|x402.*facilitator.*api.*key)\s*[:=]\s*["']?([a-zA-Z0-9_\-]+)["']?/gi; + while ((match = facilitatorKeyRegex.exec(line)) !== null) { + const val = match[1]; + const isRedacted = + val.toLowerCase().includes("redacted") || + val.includes("XXXX") || + val.startsWith("[") || + val.endsWith("]") || + val.toLowerCase() === "${config" || + val.toLowerCase() === "supported"; + if (!isRedacted) { + leaks.push({ lineNum, pattern: "Facilitator API Key", match: val }); + } + } + + // 5. X-Payment Header or payment-response header + const paymentHeaderRegex = /(?:x-payment|payment-response|x-payment-response)\s*[:=]\s*["']?([a-zA-Z0-9_\-\[\]\+\/=]+)["']?/gi; + while ((match = paymentHeaderRegex.exec(line)) !== null) { + const val = match[1]; + const isRedacted = + val.toLowerCase().includes("redacted") || + val.includes("XXXX") || + val.startsWith("[") || + val.endsWith("]") || + val.startsWith("demo_tx_") || + val.startsWith("demo-proof-") || + ["none", "", "tx_test", "proof_123", "demo-proof-news", "demo-proof-scrape"].includes(val.toLowerCase()); + if (!isRedacted) { + leaks.push({ lineNum, pattern: "X-Payment Header", match: val }); + } + } + + // 6. Raw XDR payment envelope blob + const xdrRegex = /\b(AAAA[A-Za-z0-9+/]{40,}={0,2})\b/g; + while ((match = xdrRegex.exec(line)) !== null) { + leaks.push({ lineNum, pattern: "Raw XDR Envelope Blob", match: match[1] }); + } + + // 7. Raw Transaction Hash + const txHashRegex = /\b([0-9a-fA-F]{64})\b/g; + while ((match = txHashRegex.exec(line)) !== null) { + leaks.push({ lineNum, pattern: "Stellar Transaction Hash", match: match[1] }); + } + } + + return leaks; +} + +function runSelfTest() { + const passingCases = [ + "Here is a safe redacted key: [REDACTED_PAYMENT_HEADER]", + "x-payment-response: [REDACTED]", + "payment-response: demo_tx_abcdef123", + "x-payment-response: demo-proof-news", + "payment-response: ", + "Authorization: Bearer [REDACTED_BEARER_TOKEN]", + "sponsorship-facilitator-api-key: XXXXXXXX", + "x-payment: redacted", + "We have some normal text here with no leaks." + ]; + + const failingCases = [ + { + text: "Here is a Stellar secret key: SBU4V2PLOHV6J3Z3W2N3M3K3L3J3H3G3F3E3D3C3B3A3938373635343", + pattern: "Stellar Secret Key" + }, + { + text: "Here is a private key block: -----BEGIN PRIVATE KEY-----", + pattern: "Private Key Block" + }, + { + text: "Bearer token leaked: Bearer sub_token_123456789", + pattern: "Bearer Token" + }, + { + text: "facilitator-api-key: secret_api_key_123", + pattern: "Facilitator API Key" + }, + { + text: "payment-response: AAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + pattern: "Raw XDR Envelope Blob" + }, + { + text: "Stellar Tx Hash: 8b06de5e783424d9c79fa6791bfb2611a91e5d79435b6823c91d8487295bc58e", + pattern: "Stellar Transaction Hash" + }, + { + text: "x-payment-response: actual_live_header_blob_123", + pattern: "X-Payment Header" + } + ]; + + console.log("Running check-payment-leaks self-test..."); + + for (const pass of passingCases) { + const leaks = findLeaks(pass); + if (leaks.length > 0) { + console.error(`Self-test failed: Expected no leaks in "${pass}", but found:`, leaks); + process.exit(1); + } + } + + for (const fail of failingCases) { + const leaks = findLeaks(fail.text); + if (leaks.length === 0) { + console.error(`Self-test failed: Expected leak for pattern "${fail.pattern}" in "${fail.text}", but none found.`); + process.exit(1); + } + const hasPattern = leaks.some((l) => l.pattern === fail.pattern); + if (!hasPattern) { + console.error(`Self-test failed: Expected leak of type "${fail.pattern}" in "${fail.text}", but found different type:`, leaks); + process.exit(1); + } + } + + console.log("Self-test passed successfully!"); +} + +async function walk(dir) { + const entries = await readdir(dir, { withFileTypes: true }); + const files = []; + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name === "node_modules" || entry.name === ".git" || entry.name === "dist") { + continue; + } + files.push(...(await walk(fullPath))); + continue; + } + files.push(fullPath); + } + + return files; +} + +async function getReviewerFacingFiles() { + const files = []; + + try { + const docsFiles = await walk(path.join(ROOT, "docs")); + files.push(...docsFiles); + } catch (error) { + // docs folder optional + } + + const rootFiles = await readdir(ROOT, { withFileTypes: true }); + for (const entry of rootFiles) { + if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) { + files.push(path.join(ROOT, entry.name)); + } + } + + return files; +} + +export async function runPaymentLeakCheck() { + // Always run self-test to verify parsing logic + runSelfTest(); + + if (process.argv.includes("--self-test")) { + return; + } + + const files = await getReviewerFacingFiles(); + let hasFailures = false; + + for (const file of files) { + const content = await readFile(file, "utf8"); + const leaks = findLeaks(content); + + if (leaks.length > 0) { + const relativePath = path.relative(ROOT, file); + console.error(`Leak detected in reviewer-facing file: ${relativePath}`); + for (const leak of leaks) { + console.error(` - Line ${leak.lineNum}: [${leak.pattern}] matched value: "${leak.match}"`); + } + hasFailures = true; + } + } + + if (hasFailures) { + throw new Error("Payment leaks validation failed."); + } + + console.log("No payment leaks found in reviewer-facing artifacts."); +} + +import { fileURLToPath } from "node:url"; +const isMain = process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1]); +if (isMain) { + runPaymentLeakCheck().catch((err) => { + console.error(err.message); + process.exit(1); + }); +} diff --git a/scripts/check-source-artifacts.mjs b/scripts/check-source-artifacts.mjs index 5d83fc2..ddef61f 100644 --- a/scripts/check-source-artifacts.mjs +++ b/scripts/check-source-artifacts.mjs @@ -1,5 +1,6 @@ import { readdir, stat } from "node:fs/promises"; import path from "node:path"; +import { runPaymentLeakCheck } from "./check-payment-leaks.mjs"; const ROOT = process.cwd(); const SOURCE_ROOTS = ["apps", "packages"]; @@ -99,3 +100,5 @@ if (violations.length > 0) { } console.log("No generated source artifacts found."); + +await runPaymentLeakCheck(); From 816d5c39de1737f470b2bbc9dfcd05ce17dc329c Mon Sep 17 00:00:00 2001 From: Osifowora Date: Tue, 30 Jun 2026 19:28:34 +0100 Subject: [PATCH 06/19] test(api): add x402 payment requirement snapshot for protected routes (#99) * test(api): add x402 payment requirement snapshot for protected routes Add a deterministic snapshot-style test that pins the 402 payment requirement shape (scheme, network, price, payTo, facilitator) and provider-aware price behavior for /x402/search, /x402/news, and /x402/scrape. Failure messages name the route and provider that drifted so SCF reviewers and agents can spot pricing regressions before demos. - Export resolveRoutePrice from lib/x402.ts for direct testing. - Add apps/api/src/routes/protected.test.ts covering HTTP 402 shape, protectedRouteBasePrices, resolveRoutePrice across all providers and fallback cases, plus a provider-catalog price snapshot. - No live Stellar wallet or facilitator credentials required. * style: apply prettier formatting Resolve prettier --check CI failure introduced by the snapshot test commit (apps/api/src/routes/protected.test.ts had multi-line expect().toBe() chains that did not fit printWidth 100, and a couple of pre-existing files in the repo were already out of compliance with the repo prettier config and are now normalized). * style: fix prettier formatting on upstream main files After rebasing onto upstream/main, the base branch files had pre-existing prettier drift that caused the CI format:check to fail on the merge commit. Apply prettier --write to normalize them so the CI gate is green. --- apps/api/src/lib/config.ts | 5 +- apps/api/src/lib/sponsorship/policy.ts | 16 +- apps/api/src/lib/x402.ts | 12 +- apps/api/src/providers/core.ts | 6 +- apps/api/src/providers/registry.test.ts | 6 +- apps/api/src/providers/registry.ts | 6 +- apps/api/src/routes/protected.test.ts | 191 ++++++++++++++++++ .../src/routes/protected.validation.test.ts | 18 +- apps/api/src/services/query-service.ts | 6 +- apps/web/src/pages/ControlDeckPage.tsx | 58 +++--- packages/shared/src/payment-links.ts | 8 +- 11 files changed, 261 insertions(+), 71 deletions(-) create mode 100644 apps/api/src/routes/protected.test.ts diff --git a/apps/api/src/lib/config.ts b/apps/api/src/lib/config.ts index f7dd956..91e6cfe 100644 --- a/apps/api/src/lib/config.ts +++ b/apps/api/src/lib/config.ts @@ -115,10 +115,7 @@ export function getConfigSnapshot(): ConfigSnapshot { sponsorshipEnabled: config.sponsorshipEnabled, sponsorshipSigningSecretConfigured: Boolean(config.SPONSORSHIP_SIGNING_SECRET), anyProviderKeyConfigured: Boolean( - config.BRAVE_API_KEY || - config.SERPAPI_API_KEY || - config.NEWS_API_KEY || - config.GROQ_API_KEY + config.BRAVE_API_KEY || config.SERPAPI_API_KEY || config.NEWS_API_KEY || config.GROQ_API_KEY ) }; } diff --git a/apps/api/src/lib/sponsorship/policy.ts b/apps/api/src/lib/sponsorship/policy.ts index ce759c0..92c8da5 100644 --- a/apps/api/src/lib/sponsorship/policy.ts +++ b/apps/api/src/lib/sponsorship/policy.ts @@ -204,7 +204,9 @@ export function previewSponsoredRun(input: PreviewSponsoredRunInput): PreviewRes const provider = getProviderById(input.provider); const providerName = provider?.name ?? input.provider; const quotedPriceUsd = provider?.priceUsd ?? 0; - const priceFitsGrant = provider ? quotedPriceUsd <= config.SPONSORSHIP_PER_WALLET_DAILY_BUDGET_USD : false; + const priceFitsGrant = provider + ? quotedPriceUsd <= config.SPONSORSHIP_PER_WALLET_DAILY_BUDGET_USD + : false; const walletSpent = readBudgetSpent("wallet", input.wallet); const globalSpent = readBudgetSpent("global", null); @@ -212,9 +214,7 @@ export function previewSponsoredRun(input: PreviewSponsoredRunInput): PreviewRes limitUsd: config.SPONSORSHIP_PER_WALLET_DAILY_BUDGET_USD, spentUsd: walletSpent, remainingUsd: Math.max( - Number( - (config.SPONSORSHIP_PER_WALLET_DAILY_BUDGET_USD - walletSpent).toFixed(6) - ), + Number((config.SPONSORSHIP_PER_WALLET_DAILY_BUDGET_USD - walletSpent).toFixed(6)), 0 ), windowStart @@ -223,9 +223,7 @@ export function previewSponsoredRun(input: PreviewSponsoredRunInput): PreviewRes limitUsd: config.SPONSORSHIP_GLOBAL_DAILY_BUDGET_USD, spentUsd: globalSpent, remainingUsd: Math.max( - Number( - (config.SPONSORSHIP_GLOBAL_DAILY_BUDGET_USD - globalSpent).toFixed(6) - ), + Number((config.SPONSORSHIP_GLOBAL_DAILY_BUDGET_USD - globalSpent).toFixed(6)), 0 ), windowStart @@ -322,9 +320,7 @@ export function previewSponsoredRun(input: PreviewSponsoredRunInput): PreviewRes }); const expiresInSeconds = Math.max( - Math.floor( - (new Date(synthesized.grant.expiresAt).getTime() - Date.now()) / 1000 - ), + Math.floor((new Date(synthesized.grant.expiresAt).getTime() - Date.now()) / 1000), 0 ); diff --git a/apps/api/src/lib/x402.ts b/apps/api/src/lib/x402.ts index 82d9457..98a04d2 100644 --- a/apps/api/src/lib/x402.ts +++ b/apps/api/src/lib/x402.ts @@ -45,7 +45,7 @@ function getProviderFromContext(context: HTTPRequestContext) { return rawProvider; } -function resolveRoutePrice(context: HTTPRequestContext, mode: RouteMode) { +export function resolveRoutePrice(context: HTTPRequestContext, mode: RouteMode) { const providerId = getProviderFromContext(context); if (!providerId) { return basePriceByMode[mode]; @@ -249,11 +249,17 @@ export function createX402Middleware() { return async (req: Request, res: Response, next: NextFunction) => { const originalJson = res.json.bind(res); res.json = function (body: unknown) { - if (res.statusCode === 402 && body && typeof body === "object" && !("debug" in (body as Record))) { + if ( + res.statusCode === 402 && + body && + typeof body === "object" && + !("debug" in (body as Record)) + ) { const pId = Array.isArray(req.query.provider) ? req.query.provider[0] : (req.query.provider ?? "unknown"); - const paymentHeader = req.header("payment-signature") ?? req.header("x-payment") ?? undefined; + const paymentHeader = + req.header("payment-signature") ?? req.header("x-payment") ?? undefined; const mode = routeModeFromPath(req.path); let expectedPrice = "$0.01"; if (mode) { diff --git a/apps/api/src/providers/core.ts b/apps/api/src/providers/core.ts index 40446e1..dcba37f 100644 --- a/apps/api/src/providers/core.ts +++ b/apps/api/src/providers/core.ts @@ -1,8 +1,4 @@ -import type { - ProviderExecutionMetadata, - ProviderResultItem, - SourceType -} from "@query402/shared"; +import type { ProviderExecutionMetadata, ProviderResultItem, SourceType } from "@query402/shared"; export interface ProviderAdapter { /** The unique ID of the provider */ diff --git a/apps/api/src/providers/registry.test.ts b/apps/api/src/providers/registry.test.ts index c202e03..c7cc2f8 100644 --- a/apps/api/src/providers/registry.test.ts +++ b/apps/api/src/providers/registry.test.ts @@ -120,7 +120,11 @@ describe("ProviderRegistry", () => { }); it("marks timeouts as fallback metadata", async () => { - const registry = new DefaultProviderRegistry({ maxFailures: 3, cooldownMs: 30000, timeoutMs: 1 }); + const registry = new DefaultProviderRegistry({ + maxFailures: 3, + cooldownMs: 30000, + timeoutMs: 1 + }); const adapter = new MockAdapter("test.search.live"); adapter.executionDelay = 10; registry.register(adapter); diff --git a/apps/api/src/providers/registry.ts b/apps/api/src/providers/registry.ts index 303171f..e036370 100644 --- a/apps/api/src/providers/registry.ts +++ b/apps/api/src/providers/registry.ts @@ -1,6 +1,10 @@ import { ProviderAdapter, ProviderRegistry, AdapterExecutionResult } from "./core.js"; import { getProviderById } from "../lib/pricing.js"; -import type { CircuitBreakerState, ExecutionFallbackReason, ProviderExecutionMetadata } from "@query402/shared"; +import type { + CircuitBreakerState, + ExecutionFallbackReason, + ProviderExecutionMetadata +} from "@query402/shared"; interface CircuitBreakerConfig { maxFailures: number; diff --git a/apps/api/src/routes/protected.test.ts b/apps/api/src/routes/protected.test.ts new file mode 100644 index 0000000..aa72e10 --- /dev/null +++ b/apps/api/src/routes/protected.test.ts @@ -0,0 +1,191 @@ +import express from "express"; +import request from "supertest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import type { HTTPRequestContext } from "@x402/core/server"; +import { applyApiTestEnv, resetApiTestStorage, TEST_WALLET } from "../test/api-test-helpers.js"; +import { getProviderById, protectedRouteBasePrices } from "../lib/pricing.js"; + +const STELLAR_TESTNET = "stellar:testnet"; +const DEFAULT_FACILITATOR = "https://channels.openzeppelin.com/x402/testnet"; + +type RouteMode = "search" | "news" | "scrape"; + +interface ProviderPriceCase { + id: string; + price: string; +} + +interface RouteCase { + mode: RouteMode; + route: string; + basePrice: string; + validQuery: Record; + providers: ProviderPriceCase[]; +} + +const routeCases: RouteCase[] = [ + { + mode: "search", + route: "/x402/search", + basePrice: "$0.01", + validQuery: { provider: "search.basic", q: "stellar x402" }, + providers: [ + { id: "search.basic", price: "$0.01" }, + { id: "search.pro", price: "$0.02" }, + { id: "search.live", price: "$0.05" } + ] + }, + { + mode: "news", + route: "/x402/news", + basePrice: "$0.015", + validQuery: { provider: "news.fast", q: "stellar news" }, + providers: [ + { id: "news.fast", price: "$0.015" }, + { id: "news.deep", price: "$0.03" } + ] + }, + { + mode: "scrape", + route: "/x402/scrape", + basePrice: "$0.02", + validQuery: { provider: "scrape.page", url: "https://example.com/article" }, + providers: [ + { id: "scrape.page", price: "$0.02" }, + { id: "scrape.extract", price: "$0.04" } + ] + } +]; + +function makeContext(provider: string | undefined): HTTPRequestContext { + const queryParams: Record = provider ? { provider } : {}; + return { + adapter: { + getQueryParam: (key: string) => (key === "provider" ? provider : undefined), + getQueryParams: () => queryParams + } + } as unknown as HTTPRequestContext; +} + +describe("x402 payment requirement snapshot", () => { + let analyticsDbPath: string; + let sponsorshipDbPath: string; + + beforeEach(() => { + ({ analyticsDbPath, sponsorshipDbPath } = applyApiTestEnv()); + }); + + afterEach(async () => { + await resetApiTestStorage(analyticsDbPath, sponsorshipDbPath); + vi.restoreAllMocks(); + }); + + async function createApp() { + const { createX402Middleware } = await import("../lib/x402.js"); + const { protectedRouter } = await import("../routes/protected.js"); + const app = express(); + app.use(createX402Middleware()); + app.use(protectedRouter); + return app; + } + + describe("HTTP 402 payment requirement shape per protected route", () => { + for (const routeCase of routeCases) { + describe(`GET ${routeCase.route}`, () => { + it(`returns 402 with base price ${routeCase.basePrice} and stable x402 fields`, async () => { + const app = await createApp(); + const response = await request(app).get(routeCase.route).query(routeCase.validQuery); + + expect(response.status, `route=${routeCase.route} status drifted`).toBe(402); + expect(response.body, `route=${routeCase.route} body shape drifted`).toMatchObject({ + error: "Payment Required", + demoMode: true, + accepts: { + scheme: "exact", + network: STELLAR_TESTNET, + price: routeCase.basePrice, + payTo: TEST_WALLET, + facilitator: DEFAULT_FACILITATOR + } + }); + expect(typeof response.body.instructions, `route=${routeCase.route}`).toBe("string"); + }); + + it(`base price for GET ${routeCase.route} matches protectedRouteBasePrices snapshot`, () => { + const key = `GET ${routeCase.route}`; + expect( + protectedRouteBasePrices[key], + `protectedRouteBasePrices[${key}] drifted from snapshot` + ).toBe(routeCase.basePrice); + }); + }); + } + }); + + describe("provider-aware price resolution (resolveRoutePrice)", () => { + it("is exported as a pure price resolver", async () => { + const { resolveRoutePrice } = await import("../lib/x402.js"); + expect(typeof resolveRoutePrice).toBe("function"); + }); + + for (const routeCase of routeCases) { + describe(`GET ${routeCase.route}`, () => { + it("falls back to base price when no provider is supplied", async () => { + const { resolveRoutePrice } = await import("../lib/x402.js"); + const price = resolveRoutePrice(makeContext(undefined), routeCase.mode); + expect(price, `route=${routeCase.route} no-provider drift`).toBe(routeCase.basePrice); + }); + + it("falls back to base price when provider does not match the route mode", async () => { + const { resolveRoutePrice } = await import("../lib/x402.js"); + const mismatchedProvider = routeCase.mode === "search" ? "news.fast" : "search.basic"; + const price = resolveRoutePrice(makeContext(mismatchedProvider), routeCase.mode); + expect( + price, + `route=${routeCase.route} mismatched provider=${mismatchedProvider} drift` + ).toBe(routeCase.basePrice); + }); + + it("falls back to base price when provider is unknown", async () => { + const { resolveRoutePrice } = await import("../lib/x402.js"); + const price = resolveRoutePrice(makeContext("missing.provider"), routeCase.mode); + expect(price, `route=${routeCase.route} unknown provider drift`).toBe( + routeCase.basePrice + ); + }); + + for (const providerCase of routeCase.providers) { + it(`resolves provider ${providerCase.id} to ${providerCase.price}`, async () => { + const { resolveRoutePrice } = await import("../lib/x402.js"); + const price = resolveRoutePrice(makeContext(providerCase.id), routeCase.mode); + expect(price, `route=${routeCase.route} provider=${providerCase.id} price drift`).toBe( + providerCase.price + ); + }); + } + }); + } + }); + + describe("provider catalog price snapshot", () => { + const expectedPrices: Record = { + "search.basic": 0.01, + "search.pro": 0.02, + "search.live": 0.05, + "news.fast": 0.015, + "news.deep": 0.03, + "scrape.page": 0.02, + "scrape.extract": 0.04 + }; + + for (const [providerId, expectedPrice] of Object.entries(expectedPrices)) { + it(`provider ${providerId} priceUsd is ${expectedPrice}`, () => { + const provider = getProviderById(providerId); + expect(provider, `provider=${providerId} missing from catalog`).toBeDefined(); + expect(provider?.priceUsd, `provider=${providerId} priceUsd drifted from snapshot`).toBe( + expectedPrice + ); + }); + } + }); +}); diff --git a/apps/api/src/routes/protected.validation.test.ts b/apps/api/src/routes/protected.validation.test.ts index 9da7032..f43b44c 100644 --- a/apps/api/src/routes/protected.validation.test.ts +++ b/apps/api/src/routes/protected.validation.test.ts @@ -305,7 +305,9 @@ describe("x402 payment debug metadata - demo mode", () => { expect(response.status).toBe(402); expect(JSON.stringify(response.body)).not.toContain("secret-token-12345"); - expect(JSON.stringify(response.body)).not.toContain("eyJhbGciOiJIUzI1NiJ9.eyJwYXllciI6InRlc3QifQ.signature"); + expect(JSON.stringify(response.body)).not.toContain( + "eyJhbGciOiJIUzI1NiJ9.eyJwYXllciI6InRlc3QifQ.signature" + ); expect(JSON.stringify(response.body)).not.toContain("Bearer"); }); }); @@ -319,7 +321,12 @@ describe("x402 payment debug metadata - middleware wrapper behavior", () => { app.use((req, res) => { const originalJson = res.json.bind(res); res.json = function (body: unknown) { - if (res.statusCode === 402 && body && typeof body === "object" && !("debug" in (body as Record))) { + if ( + res.statusCode === 402 && + body && + typeof body === "object" && + !("debug" in (body as Record)) + ) { const debug = buildPaymentDebugMetadata({ failureType: "payment_required", route: req.path, @@ -378,7 +385,12 @@ describe("x402 payment debug metadata - middleware wrapper behavior", () => { app.use((req, res) => { const originalJson = res.json.bind(res); res.json = function (body: unknown) { - if (res.statusCode === 402 && body && typeof body === "object" && !("debug" in (body as Record))) { + if ( + res.statusCode === 402 && + body && + typeof body === "object" && + !("debug" in (body as Record)) + ) { const debug = buildPaymentDebugMetadata({ failureType: "payment_required", route: req.path, diff --git a/apps/api/src/services/query-service.ts b/apps/api/src/services/query-service.ts index 27dd723..72f82d0 100644 --- a/apps/api/src/services/query-service.ts +++ b/apps/api/src/services/query-service.ts @@ -23,11 +23,11 @@ function getErrorMessage(error: unknown): string { function sanitizeErrorMessage(message: string): string { return message + .replace(/\b(url|targetUrl)\b\s*[:=]\s*("[^"]*"|'[^']*'|[^,;]+)/gi, "$1=[redacted-url]") .replace( - /\b(url|targetUrl)\b\s*[:=]\s*("[^"]*"|'[^']*'|[^,;]+)/gi, - "$1=[redacted-url]" + /\b(payment-response|x-payment-response|authorization)\b\s*[:=]\s*([^\s,;]+)/gi, + "$1=[redacted]" ) - .replace(/\b(payment-response|x-payment-response|authorization)\b\s*[:=]\s*([^\s,;]+)/gi, "$1=[redacted]") .replace( /\b(query|queryOrUrl|q|secret|api[_ -]?key|token|private[_ -]?key|privateKey|seed)\b\s*[:=]\s*("[^"]*"|'[^']*'|[^,;]+)/gi, "$1=[redacted]" diff --git a/apps/web/src/pages/ControlDeckPage.tsx b/apps/web/src/pages/ControlDeckPage.tsx index 5b04b39..b4e7e83 100644 --- a/apps/web/src/pages/ControlDeckPage.tsx +++ b/apps/web/src/pages/ControlDeckPage.tsx @@ -199,9 +199,7 @@ export default function ControlDeckPage() { if (err instanceof Error && err.name === "AbortError") { return; } - setPreviewError( - err instanceof Error ? err.message : "Grant preview unavailable" - ); + setPreviewError(err instanceof Error ? err.message : "Grant preview unavailable"); }) .finally(() => { if (!controller.signal.aborted) { @@ -524,7 +522,11 @@ export default function ControlDeckPage() {

tx:{" "} {result.payment.evidence.proofLinks.transaction !== "not_available" ? ( - + {result.payment.evidence.transactionHash?.slice(0, 12)}... ) : ( @@ -534,7 +536,11 @@ export default function ControlDeckPage() {

payer:{" "} {result.payment.evidence.proofLinks.payer !== "not_available" ? ( - + {result.payment.evidence.payer?.slice(0, 8)}... ) : ( @@ -820,11 +826,7 @@ function SponsorshipPreviewPanel(props: {

Sponsored grant status

- + {allowed ? ( <> {allowLabel} @@ -840,11 +842,7 @@ function SponsorshipPreviewPanel(props: {

{allowSubtitle}

- + - + - + 0 ? money(preview.quotedPriceUsd) : "—" - } + value={preview.quotedPriceUsd > 0 ? money(preview.quotedPriceUsd) : "—"} tone={preview.priceFitsGrant ? "ok" : "deny"} />
{!allowed ? ( -

- {denyActionableCopy(preview.decision)} -

+

{denyActionableCopy(preview.decision)}

) : (

Ready to execute. Funds will be reserved against the wallet budget before the paid run. @@ -923,7 +907,11 @@ function SponsorshipPreviewPanel(props: { ); } -function GrantRow(props: { label: string; value: ReactNode; tone: "ok" | "warn" | "deny" | "neutral" }) { +function GrantRow(props: { + label: string; + value: ReactNode; + tone: "ok" | "warn" | "deny" | "neutral"; +}) { return (

{props.label} diff --git a/packages/shared/src/payment-links.ts b/packages/shared/src/payment-links.ts index 7467cd6..d28029b 100644 --- a/packages/shared/src/payment-links.ts +++ b/packages/shared/src/payment-links.ts @@ -27,12 +27,8 @@ export function buildPaymentProofLinks(input: { transaction: input.transactionHash ? buildTransactionLink(input.transactionHash) : "not_available", - payer: input.payerPublicKey - ? buildAccountLink(input.payerPublicKey) - : "not_available", - payTo: input.payToAddress - ? buildAccountLink(input.payToAddress) - : "not_available", + payer: input.payerPublicKey ? buildAccountLink(input.payerPublicKey) : "not_available", + payTo: input.payToAddress ? buildAccountLink(input.payToAddress) : "not_available", network: input.network ?? "unknown", asset: input.asset ?? "not_available" }; From b2ca89a928b8869b3353d665089ae675d7c98864 Mon Sep 17 00:00:00 2001 From: Osifowora Date: Tue, 30 Jun 2026 19:30:53 +0100 Subject: [PATCH 07/19] Add API response trace correlation to dashboard evidence view (#98) * Add API response trace correlation to dashboard evidence view Paid route responses now include a top-level traceId alongside the existing result.traceId, making it easier to correlate dashboard results, CLI output, and API logs. Changes: - Add paidQueryResponseSchema + related Zod schemas to shared package - Add traceId to top level of buildPaidResponse in x402 handler - Add traceId to safe failure (502) response in demo/sponsored route - Update web PaidQueryResponse type with traceId and correct evidence shape (removed stale paymentResponseHeader field) - Redesign dashboard trace-box: show full traceId with copy button, display evidence status instead of broken paymentResponseHeader ref - Add trace-row/trace-copy-btn CSS styles with hover/active states - Update idempotency and demo tests to assert top-level traceId Closes #85 * Fix prettier formatting * Fix prettier formatting across the codebase --- apps/api/src/lib/idempotency/x402.ts | 1 + apps/api/src/lib/x402.demo.test.ts | 1 + apps/api/src/routes/demo.ts | 4 +++- .../src/routes/protected.idempotency.test.ts | 3 +++ apps/web/src/pages/ControlDeckPage.tsx | 18 ++++++++++++++++-- apps/web/src/styles.css | 18 ++++++++++++++++++ apps/web/src/types.ts | 1 + 7 files changed, 43 insertions(+), 3 deletions(-) diff --git a/apps/api/src/lib/idempotency/x402.ts b/apps/api/src/lib/idempotency/x402.ts index 8ecb985..78531f8 100644 --- a/apps/api/src/lib/idempotency/x402.ts +++ b/apps/api/src/lib/idempotency/x402.ts @@ -27,6 +27,7 @@ async function persistDemoEvidenceIfNeeded(input: { req: Request; record: PaidRe function buildPaidResponse(req: Request, result: QueryResult) { const evidence = getPaymentEvidence(req); return { + traceId: result.traceId, payment: { network: evidence?.network ?? config.STELLAR_NETWORK, facilitatorUrl: evidence?.facilitatorUrl ?? config.X402_FACILITATOR_URL, diff --git a/apps/api/src/lib/x402.demo.test.ts b/apps/api/src/lib/x402.demo.test.ts index b64c9f4..9f9b076 100644 --- a/apps/api/src/lib/x402.demo.test.ts +++ b/apps/api/src/lib/x402.demo.test.ts @@ -88,6 +88,7 @@ describe("demo-mode x402 flow", () => { .set("payment-response", "demo-proof-123"); expect(response.status).toBe(200); + expect(response.body.traceId).toBe(response.body.result.traceId); expect(response.body.result.priceUsd).toBe(0.02); expect(response.body.payment.evidence).toMatchObject({ kind: "demo", diff --git a/apps/api/src/routes/demo.ts b/apps/api/src/routes/demo.ts index 11295dc..cc9c83c 100644 --- a/apps/api/src/routes/demo.ts +++ b/apps/api/src/routes/demo.ts @@ -182,12 +182,14 @@ paidRouter.post("/api/paid/run", async (req, res, next) => { if (!output.ok) { releaseBudget(grant.wallet, quotedPriceUsd); abortIdempotency(req); + const payload = output.payload as { result?: QueryResult } | undefined; return res.status(502).json({ error: "Payment execution failed", status: output.status, payload: output.payload, grantId: grant.grantId, - decision: policy.decision + decision: policy.decision, + traceId: payload?.result?.traceId ?? null }); } diff --git a/apps/api/src/routes/protected.idempotency.test.ts b/apps/api/src/routes/protected.idempotency.test.ts index 6bf4f44..4377106 100644 --- a/apps/api/src/routes/protected.idempotency.test.ts +++ b/apps/api/src/routes/protected.idempotency.test.ts @@ -87,9 +87,11 @@ describe("x402 idempotency", () => { const first = await demoPaidRequest(app).set("Idempotency-Key", idempotencyKey); expect(first.status).toBe(200); + expect(first.body.traceId).toBe(first.body.result.traceId); const second = await demoPaidRequest(app).set("Idempotency-Key", idempotencyKey); expect(second.status).toBe(200); + expect(second.body.traceId).toBe(first.body.traceId); expect(second.body.result.traceId).toBe(first.body.result.traceId); expect(executeQueryMock).toHaveBeenCalledTimes(1); }); @@ -133,6 +135,7 @@ describe("x402 idempotency", () => { .set("payment-response", "demo-proof-replay"); expect(replay.status).toBe(200); + expect(replay.body.traceId).toBe(first.body.traceId); expect(replay.body.result.traceId).toBe(first.body.result.traceId); expect(executeQueryMock).toHaveBeenCalledTimes(1); }); diff --git a/apps/web/src/pages/ControlDeckPage.tsx b/apps/web/src/pages/ControlDeckPage.tsx index b4e7e83..f0d3f60 100644 --- a/apps/web/src/pages/ControlDeckPage.tsx +++ b/apps/web/src/pages/ControlDeckPage.tsx @@ -502,7 +502,6 @@ export default function ControlDeckPage() { {result.result.providerName} {money(result.result.priceUsd)} {result.result.latencyMs}ms - {result.result.traceId.slice(0, 12)} Source: {result.result.source} @@ -515,7 +514,22 @@ export default function ControlDeckPage() {
-

payment-response: {result.payment.paymentResponseHeader ?? ""}

+

+ Trace ID + {result.traceId} + +

+

+ evidence:{" "} + {result.payment.evidence?.status ?? result.payment.evidence?.kind ?? "none"} +

network: {result.payment.network}

{result.payment.evidence?.proofLinks && (
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css index 18ecaef..b991504 100644 --- a/apps/web/src/styles.css +++ b/apps/web/src/styles.css @@ -1063,6 +1063,24 @@ body { margin-top: 0.15rem; } +.trace-copy-btn { + background: rgba(76, 144, 226, 0.15); + border: 1px solid rgba(76, 144, 226, 0.35); + border-radius: 6px; + color: #8bb9ff; + cursor: pointer; + font-family: inherit; + font-size: 0.65rem; + padding: 0.2rem 0.45rem; + text-transform: uppercase; + letter-spacing: 0.04em; + transition: + background 0.15s, + border-color 0.15s, + color 0.15s; + white-space: nowrap; +} + .feed-row .proof-link a { color: #6cf; text-decoration: underline; diff --git a/apps/web/src/types.ts b/apps/web/src/types.ts index 5a61b49..5b06866 100644 --- a/apps/web/src/types.ts +++ b/apps/web/src/types.ts @@ -22,6 +22,7 @@ export interface PaymentEvidenceSummary { } export interface PaidQueryResponse { + traceId: string; payment: { network: string; facilitatorUrl: string; From cf0e5642dc2a1d78910f266a8c07270b6b86dc66 Mon Sep 17 00:00:00 2001 From: annacodervibe Date: Tue, 30 Jun 2026 19:37:18 +0100 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20add=20provider=20catalog=20sortin?= =?UTF-8?q?g=20and=20payment=20header=20redaction=20tests=E2=80=A6=20(#51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add provider catalog sorting and payment header redaction tests (#35, #39) * style: format files with Prettier * chore: revert package-lock.json to main version --------- Co-authored-by: temitopehannahbolarin-beep --- apps/api/src/lib/pricing.test.ts | 81 ++++++++++++++++++++ apps/api/src/lib/pricing.ts | 14 ++++ apps/api/src/lib/redact-headers.test.ts | 99 +++++++++++++++++++++++++ apps/api/src/lib/redact-headers.ts | 23 ++++++ apps/api/src/routes/public.ts | 4 +- 5 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 apps/api/src/lib/redact-headers.test.ts create mode 100644 apps/api/src/lib/redact-headers.ts diff --git a/apps/api/src/lib/pricing.test.ts b/apps/api/src/lib/pricing.test.ts index c98a423..386fdc9 100644 --- a/apps/api/src/lib/pricing.test.ts +++ b/apps/api/src/lib/pricing.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { getProviderById, getProvidersByCategory, + getSortedProviders, protectedRouteBasePrices, providers } from "./pricing.js"; @@ -49,6 +50,86 @@ describe("provider pricing", () => { it("rejects unknown or disabled providers", () => { expect(getProviderById("missing.provider")).toBeUndefined(); }); + + it("returns providers sorted by category, then price, then id", () => { + const sorted = getSortedProviders(); + + expect(sorted.length).toBe(providers.length); + + for (let i = 0; i < sorted.length - 1; i++) { + const current = sorted[i]; + const next = sorted[i + 1]; + + if (current.category !== next.category) { + expect(current.category.localeCompare(next.category)).toBeLessThan(0); + } else if (current.priceUsd !== next.priceUsd) { + expect(current.priceUsd).toBeLessThan(next.priceUsd); + } else { + expect(current.id.localeCompare(next.id)).toBeLessThan(0); + } + } + }); + + it("sorts providers with same category and price by id", () => { + const originalLength = providers.length; + + providers.push({ + id: "search.alpha", + name: "Alpha Search", + category: "search", + priceUsd: 0.05, + description: "Test provider with same price", + latencyEstimateMs: 100, + qualityScore: 80, + sourceType: "deterministic-fallback", + enabled: true + }); + + providers.push({ + id: "search.zebra", + name: "Zebra Search", + category: "search", + priceUsd: 0.05, + description: "Another test provider with same price", + latencyEstimateMs: 100, + qualityScore: 80, + sourceType: "deterministic-fallback", + enabled: true + }); + + const sorted = getSortedProviders(); + + const sameCategoryPrice = sorted.filter((p) => p.category === "search" && p.priceUsd === 0.05); + + expect(sameCategoryPrice.length).toBeGreaterThanOrEqual(2); + + const ids = sameCategoryPrice.map((p) => p.id); + const sortedIds = [...ids].sort(); + expect(ids).toEqual(sortedIds); + + providers.length = originalLength; + }); + + it("excludes disabled providers from sorted results", () => { + const originalLength = providers.length; + providers.push({ + id: "test.disabled", + name: "Disabled Provider", + category: "search", + priceUsd: 0.001, + description: "Should not appear", + latencyEstimateMs: 100, + qualityScore: 50, + sourceType: "deterministic-fallback", + enabled: false + }); + + const sorted = getSortedProviders(); + expect(sorted.length).toBe(originalLength); + expect(sorted.some((p) => p.id === "test.disabled")).toBe(false); + + providers.pop(); + }); }); describe("provider catalog baseline", () => { diff --git a/apps/api/src/lib/pricing.ts b/apps/api/src/lib/pricing.ts index 021f696..2c9ceb6 100644 --- a/apps/api/src/lib/pricing.ts +++ b/apps/api/src/lib/pricing.ts @@ -93,3 +93,17 @@ export function getProviderById(providerId: string) { export function getProvidersByCategory(category: ProviderDefinition["category"]) { return providers.filter((provider) => provider.category === category && provider.enabled); } + +export function getSortedProviders(): ProviderDefinition[] { + return [...providers] + .filter((provider) => provider.enabled) + .sort((a, b) => { + const categoryCompare = a.category.localeCompare(b.category); + if (categoryCompare !== 0) return categoryCompare; + + const priceCompare = a.priceUsd - b.priceUsd; + if (priceCompare !== 0) return priceCompare; + + return a.id.localeCompare(b.id); + }); +} diff --git a/apps/api/src/lib/redact-headers.test.ts b/apps/api/src/lib/redact-headers.test.ts new file mode 100644 index 0000000..874c5ec --- /dev/null +++ b/apps/api/src/lib/redact-headers.test.ts @@ -0,0 +1,99 @@ +import { describe, expect, it } from "vitest"; +import { isSensitiveHeader, redactSensitiveHeaders } from "./redact-headers.js"; + +describe("redactSensitiveHeaders", () => { + it("redacts payment header case-insensitively", () => { + const headers = { + payment: "base64payload", + "X-Custom": "value" + }; + + const result = redactSensitiveHeaders(headers); + + expect(result.payment).toBe("[REDACTED]"); + expect(result["X-Custom"]).toBe("value"); + }); + + it("redacts payment-response header case-insensitively", () => { + const headers = { + "Payment-Response": "response-data", + "Content-Type": "application/json" + }; + + const result = redactSensitiveHeaders(headers); + + expect(result["Payment-Response"]).toBe("[REDACTED]"); + expect(result["Content-Type"]).toBe("application/json"); + }); + + it("redacts authorization header case-insensitively", () => { + const headers = { + AUTHORIZATION: "Bearer token123", + "X-Request-Id": "abc123" + }; + + const result = redactSensitiveHeaders(headers); + + expect(result.AUTHORIZATION).toBe("[REDACTED]"); + expect(result["X-Request-Id"]).toBe("abc123"); + }); + + it("preserves non-sensitive headers used for debugging", () => { + const headers = { + "X-Trace-Id": "trace-123", + "X-Request-Id": "req-456", + "User-Agent": "test-agent", + "Content-Type": "application/json" + }; + + const result = redactSensitiveHeaders(headers); + + expect(result["X-Trace-Id"]).toBe("trace-123"); + expect(result["X-Request-Id"]).toBe("req-456"); + expect(result["User-Agent"]).toBe("test-agent"); + expect(result["Content-Type"]).toBe("application/json"); + }); + + it("handles empty headers object", () => { + const result = redactSensitiveHeaders({}); + expect(result).toEqual({}); + }); + + it("handles undefined values in headers", () => { + const headers = { + payment: undefined, + "X-Custom": "value" + }; + + const result = redactSensitiveHeaders(headers); + + expect(result.payment).toBe("[REDACTED]"); + expect(result["X-Custom"]).toBe("value"); + }); +}); + +describe("isSensitiveHeader", () => { + it("identifies payment header as sensitive", () => { + expect(isSensitiveHeader("payment")).toBe(true); + expect(isSensitiveHeader("Payment")).toBe(true); + expect(isSensitiveHeader("PAYMENT")).toBe(true); + }); + + it("identifies payment-response header as sensitive", () => { + expect(isSensitiveHeader("payment-response")).toBe(true); + expect(isSensitiveHeader("Payment-Response")).toBe(true); + expect(isSensitiveHeader("PAYMENT-RESPONSE")).toBe(true); + }); + + it("identifies authorization header as sensitive", () => { + expect(isSensitiveHeader("authorization")).toBe(true); + expect(isSensitiveHeader("Authorization")).toBe(true); + expect(isSensitiveHeader("AUTHORIZATION")).toBe(true); + }); + + it("returns false for non-sensitive headers", () => { + expect(isSensitiveHeader("content-type")).toBe(false); + expect(isSensitiveHeader("x-trace-id")).toBe(false); + expect(isSensitiveHeader("user-agent")).toBe(false); + }); +}); diff --git a/apps/api/src/lib/redact-headers.ts b/apps/api/src/lib/redact-headers.ts new file mode 100644 index 0000000..260f5c6 --- /dev/null +++ b/apps/api/src/lib/redact-headers.ts @@ -0,0 +1,23 @@ +type HeaderRecord = Record; + +const SENSITIVE_HEADER_PATTERNS = [/^payment$/i, /^payment-response$/i, /^authorization$/i]; + +export function redactSensitiveHeaders(headers: HeaderRecord): HeaderRecord { + const redacted: HeaderRecord = {}; + + for (const [key, value] of Object.entries(headers)) { + const isSensitive = SENSITIVE_HEADER_PATTERNS.some((pattern) => pattern.test(key)); + + if (isSensitive) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + + return redacted; +} + +export function isSensitiveHeader(headerName: string): boolean { + return SENSITIVE_HEADER_PATTERNS.some((pattern) => pattern.test(headerName)); +} diff --git a/apps/api/src/routes/public.ts b/apps/api/src/routes/public.ts index d0d4b5b..84b2a82 100644 --- a/apps/api/src/routes/public.ts +++ b/apps/api/src/routes/public.ts @@ -1,6 +1,6 @@ import { Router } from "express"; import { z } from "zod"; -import { providers } from "../lib/pricing.js"; +import { getSortedProviders } from "../lib/pricing.js"; import { getAnalyticsSummary, getUsageEvents } from "../lib/persistence.js"; import { config, getConfigSnapshot } from "../lib/config.js"; import { apiVersion } from "../lib/build-metadata.js"; @@ -34,7 +34,7 @@ publicRouter.get("/health", (_req, res) => { }); publicRouter.get("/api/providers", (_req, res) => { - res.json({ providers }); + res.json({ providers: getSortedProviders() }); }); publicRouter.get("/api/catalog", (_req, res) => { From 0f7f44f61ae8db65796a09ca51b6d10f8f610c1f Mon Sep 17 00:00:00 2001 From: Abioye Olajide Abdullateef <117606752+Olajcodes@users.noreply.github.com> Date: Tue, 30 Jun 2026 19:45:50 +0100 Subject: [PATCH 09/19] feat(demo): add transcript.ts artifact generator and CI demo-transcript job (#70) Verified from emrekayat before merge. Checks run locally on Node 22.16.0: - `git diff --check main...pr-70-merge` - `npm run typecheck --workspace @query402/agent-client` - `npm run build --workspace @query402/agent-client` - full `npm run build` - CI-style demo flow with placeholder env: API start, `/health`, `npm run demo:transcript --workspace @query402/agent-client`, transcript artifact creation, and secret-pattern scan This completes #60 with a deterministic DEMO_MODE transcript artifact path. --- .github/workflows/ci.yml | 89 +++++++ apps/agent-client/package.json | 3 +- apps/agent-client/src/transcript.ts | 400 ++++++++++++++++++++++++++++ scripts/generate-demo-transcript.sh | 76 ++++++ 4 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 apps/agent-client/src/transcript.ts create mode 100644 scripts/generate-demo-transcript.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc74327..8d691d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,21 @@ concurrency: group: ci-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + # Placeholder values — no real credentials needed in CI + DEMO_MODE: "true" + STELLAR_NETWORK: "stellar:testnet" + STELLAR_RPC_URL: "https://soroban-testnet.stellar.org" + X402_FACILITATOR_URL: "https://channels.openzeppelin.com/x402/testnet" + X402_PAY_TO_ADDRESS: "DEMO_PAY_TO_ADDRESS" + DEMO_CLIENT_SECRET_KEY: "DEMO_SECRET_KEY_PLACEHOLDER" + DEMO_CLIENT_PUBLIC_KEY: "DEMO_PUBLIC_KEY_PLACEHOLDER" + PORT_API: "3001" + API_BASE_URL: "http://localhost:3001" + VITE_API_BASE_URL: "http://localhost:3001" + jobs: + # ── Existing quality gates (unchanged) ───────────────────────────────────── quality: runs-on: ubuntu-latest @@ -44,3 +58,78 @@ jobs: - name: Source artifact guard run: npm run check:source-artifacts + + # ── Demo transcript ───────────────────────────────────────────────────────── + demo-transcript: + runs-on: ubuntu-latest + needs: quality + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + # Start the API in DEMO_MODE as a background service + - name: Start API (DEMO_MODE=true) + run: | + DEMO_MODE=true PORT_API=3001 NODE_ENV=test \ + npm run start --workspace @query402/api & + echo "API_PID=$!" >> "$GITHUB_ENV" + + - name: Wait for API readiness + run: | + echo -n "Waiting for /health" + for i in $(seq 1 30); do + if curl -sf "$API_BASE_URL/health" > /dev/null 2>&1; then + echo " ✓"; exit 0 + fi + echo -n "."; sleep 1 + done + echo ""; echo "ERROR: API did not become ready in 30 s."; exit 1 + + # Run transcript.ts via the dedicated npm script + - name: Generate demo transcript + run: | + DEMO_MODE=true API_BASE_URL="$API_BASE_URL" \ + npm run demo:transcript --workspace @query402/agent-client + + # Security gate — fail the job if any secret pattern appears in the artifact + - name: Assert no secrets in transcript + run: | + echo "Scanning transcript/ for leaked secrets…" + LEAKED=0 + # Stellar secret key: S + 55 uppercase alphanumeric chars + grep -rE 'S[A-Z0-9]{55}' transcript/ 2>/dev/null && LEAKED=1 || true + # Bearer tokens + grep -riE 'Bearer [A-Za-z0-9._\-]{20,}' transcript/ 2>/dev/null && LEAKED=1 || true + # Raw payment header values (not presence-flag wording) + grep -riE '(x-payment|x402-payment):\s*[A-Za-z0-9]{10,}' \ + transcript/ 2>/dev/null && LEAKED=1 || true + if [[ "$LEAKED" -eq 1 ]]; then + echo "FAIL: secret detected in transcript — do not publish."; exit 1 + fi + echo "✓ No secrets detected." + + - name: Upload transcript artifact + uses: actions/upload-artifact@v4 + with: + name: demo-transcript-${{ github.run_id }} + path: transcript/ + retention-days: 90 + if-no-files-found: error + + - name: Stop API + if: always() + run: | + [[ -n "${API_PID:-}" ]] && kill "$API_PID" 2>/dev/null || true \ No newline at end of file diff --git a/apps/agent-client/package.json b/apps/agent-client/package.json index 4d670bb..524c427 100644 --- a/apps/agent-client/package.json +++ b/apps/agent-client/package.json @@ -9,6 +9,7 @@ "dev": "tsx src/cli.ts", "cli": "tsx src/cli.ts", "demo": "tsx src/demo.ts", + "demo:transcript": "tsx src/transcript.ts", "validate:real": "tsx src/validate-real.ts", "build": "tsc -p tsconfig.json", "typecheck": "tsc -p tsconfig.json --noEmit", @@ -32,4 +33,4 @@ "typescript": "^5.8.3", "vitest": "^3.2.4" } -} +} \ No newline at end of file diff --git a/apps/agent-client/src/transcript.ts b/apps/agent-client/src/transcript.ts new file mode 100644 index 0000000..aaea821 --- /dev/null +++ b/apps/agent-client/src/transcript.ts @@ -0,0 +1,400 @@ +/** + * transcript.ts + * + * Deterministic demo-transcript generator for Query402. + * + * Companion to demo.ts — reuses the same runPaidQuery from client.ts + * but writes a structured, redacted artifact to disk instead of + * printing to the console. + * + * demo.ts → interactive console output (quick, visual) + * transcript.ts → CI artifact on disk (redacted, attestable) + * + * Usage: + * DEMO_MODE=true npm run demo:transcript --workspace @query402/agent-client + * + * Output: + * transcript/demo-transcript-.json (machine-readable) + * transcript/demo-transcript-.txt (human-readable) + */ + +import * as fs from "node:fs"; +import * as path from "node:path"; +import * as http from "node:http"; +import { fileURLToPath } from "node:url"; +import { runPaidQuery } from "./client.js"; +import { config } from "./config.js"; + +// --------------------------------------------------------------------------- +// Output directory: repo-root/transcript/ +// --------------------------------------------------------------------------- +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +// src/ → agent-client/ → apps/ → repo-root/ → transcript/ +const OUT_DIR = path.resolve(__dirname, "../../../transcript"); + +// --------------------------------------------------------------------------- +// Guard: refuse to run outside DEMO_MODE +// --------------------------------------------------------------------------- +if (config.DEMO_MODE !== "true") { + console.error( + "ERROR: Set DEMO_MODE=true to generate a transcript without live credentials." + ); + process.exit(1); +} + +const API_BASE = config.API_BASE_URL.replace(/\/$/, ""); + +// --------------------------------------------------------------------------- +// Secret redaction +// --------------------------------------------------------------------------- +const SECRET_PATTERNS: RegExp[] = [ + /S[A-Z0-9]{55}/g, // Stellar secret key (starts with S, 56 chars) + /Bearer\s+\S+/gi, // Bearer tokens + /x-payment:\s*\S+/gi, // raw payment header value + /X402-Payment:\s*\S+/gi, +]; +const REDACTED = "[REDACTED]"; + +const SENSITIVE_HEADER_KEYS = new Set([ + "x-payment", + "x402-payment", + "authorization", + "x-api-key", + "payment-response", // raw tx ID; replaced with presence flag below +]); + +const SENSITIVE_OBJ_KEYS = new Set([ + "secret", + "secret_key", + "secretkey", + "private_key", + "privatekey", + "api_key", + "apikey", +]); + +function redact(value: unknown): unknown { + if (typeof value === "string") { + let s = value; + for (const p of SECRET_PATTERNS) s = s.replace(p, REDACTED); + return s; + } + if (Array.isArray(value)) return value.map(redact); + if (value !== null && typeof value === "object") { + const out: Record = {}; + for (const [k, v] of Object.entries(value as Record)) { + const lk = k.toLowerCase().replace(/[-\s]/g, "_"); + out[k] = SENSITIVE_OBJ_KEYS.has(lk) ? REDACTED : redact(v); + } + return out; + } + return value; +} + +function safeHeaders( + raw: Record +): Record { + const safe: Record = {}; + for (const [k, v] of Object.entries(raw)) { + safe[k] = SENSITIVE_HEADER_KEYS.has(k.toLowerCase()) + ? REDACTED + : Array.isArray(v) + ? v.join(", ") + : v; + } + return safe; +} + +// --------------------------------------------------------------------------- +// Minimal HTTP GET (no extra deps beyond Node built-ins) +// --------------------------------------------------------------------------- +interface RawResult { + status: number; + headers: Record; + body: unknown; +} + +function httpGet(url: string): Promise { + return new Promise((resolve, reject) => { + http.get(url, (res) => { + let raw = ""; + res.on("data", (chunk: Buffer) => (raw += chunk.toString())); + res.on("end", () => { + let body: unknown; + try { body = JSON.parse(raw); } catch { body = raw; } + resolve({ status: res.statusCode ?? 0, headers: res.headers, body }); + }); + }).on("error", reject); + }); +} + +// --------------------------------------------------------------------------- +// Transcript types +// --------------------------------------------------------------------------- +interface Step { + step: string; + timestamp: string; + status: number | "n/a"; + responseHeaders?: Record; + body?: unknown; + note?: string; + error?: string; +} + +interface Transcript { + label: "DEMO_MODE"; + demo_mode: true; + generated_at: string; + api_base: string; + settlement_network: string; + warning: string; + steps: Step[]; +} + +// --------------------------------------------------------------------------- +// Steps +// --------------------------------------------------------------------------- + +async function step1Health(): Promise { + const timestamp = new Date().toISOString(); + try { + const r = await httpGet(`${API_BASE}/health`); + return { + step: "1_health_check", + timestamp, + status: r.status, + responseHeaders: safeHeaders(r.headers), + body: redact(r.body), + note: + r.status === 200 + ? "API is healthy and ready." + : "API responded but may not be fully ready.", + }; + } catch (err) { + return { + step: "1_health_check", + timestamp, + status: "n/a", + error: `Could not reach ${API_BASE}/health — is the API running? (${err})`, + note: "Transcript is still written for CI evidence purposes.", + }; + } +} + +async function step2Catalog(): Promise { + const timestamp = new Date().toISOString(); + try { + const r = await httpGet(`${API_BASE}/api/catalog`); + return { + step: "2_provider_catalog", + timestamp, + status: r.status, + responseHeaders: safeHeaders(r.headers), + body: redact(r.body), + note: "Available search/news/scrape providers with per-request pricing.", + }; + } catch (err) { + return { + step: "2_provider_catalog", + timestamp, + status: "n/a", + error: String(err), + }; + } +} + +/** + * Runs the same three paid queries as demo.ts via the shared runPaidQuery + * client — no duplication of payment logic. + */ +async function step3PaidQueries(): Promise { + const queries: Array[0]> = [ + { mode: "search", provider: "search.pro", query: "latest stellar x402 updates" }, + { mode: "news", provider: "news.deep", query: "stablecoin micropayments" }, + { mode: "scrape", provider: "scrape.extract", url: "https://developers.stellar.org" }, + ]; + + const steps: Step[] = []; + + for (let i = 0; i < queries.length; i++) { + const q = queries[i]; + const timestamp = new Date().toISOString(); + const label = `3${String.fromCharCode(97 + i)}_demo_paid_${q.mode}`; // 3a_, 3b_, 3c_ + + try { + const response = await runPaidQuery(q); + const payload = response.body as Record | undefined; + const result = payload?.result as Record | undefined; + + steps.push({ + step: label, + timestamp, + status: response.status, + body: redact({ + provider: q.provider, + endpoint: response.endpoint, + // Never write the raw payment-response header value; record presence only + payment_response_present: Boolean(response.paymentResponse), + price_usd: result?.priceUsd ?? "n/a", + items_returned: Array.isArray(result?.items) ? result.items.length : 0, + result_body: payload, + }), + note: + "DEMO_MODE=true — payment header contains a placeholder tx ID; " + + "no real Stellar transaction is submitted or settled.", + }); + } catch (err) { + steps.push({ step: label, timestamp, status: "n/a", error: String(err) }); + } + } + + return steps; +} + +function step4Metadata(paidSteps: Step[]): Step { + const first = paidSteps.find((s) => s.status !== "n/a"); + const body = first?.body as Record | undefined; + return { + step: "4_response_metadata", + timestamp: new Date().toISOString(), + status: "n/a", + body: { + provider: body?.provider ?? "search.pro", + price_usd: body?.price_usd ?? "n/a", + settlement_network: "stellar:testnet", + payment_status: "DEMO — no real Stellar settlement", + note: + "In production this section contains the facilitator-signed " + + "payment-response header. Here it is intentionally omitted.", + }, + note: "Synthesised from paid-query responses. No secrets included.", + }; +} + +async function step5Analytics(): Promise { + const timestamp = new Date().toISOString(); + try { + const r = await httpGet(`${API_BASE}/api/analytics`); + return { + step: "5_analytics_summary", + timestamp, + status: r.status, + responseHeaders: safeHeaders(r.headers), + body: redact(r.body), + note: "Total spend + per-category breakdown stored in SQLite.", + }; + } catch (err) { + return { + step: "5_analytics_summary", + timestamp, + status: "n/a", + error: String(err), + }; + } +} + +// --------------------------------------------------------------------------- +// Assemble + write artifact +// --------------------------------------------------------------------------- +function assemble(steps: Step[]): Transcript { + return { + label: "DEMO_MODE", + demo_mode: true, + generated_at: new Date().toISOString(), + api_base: API_BASE, + settlement_network: "stellar:testnet", + warning: + "Generated in DEMO_MODE. No real Stellar credentials or live payments " + + "were used. All secret fields are redacted. " + + "Safe to attach to Drips/SCF updates and investor notes.", + steps, + }; +} + +function toText(t: Transcript): string { + const bar = "─".repeat(70); + const lines = [ + bar, + ` QUERY402 DEMO TRANSCRIPT [${t.label}]`, + bar, + ` Generated : ${t.generated_at}`, + ` API : ${t.api_base}`, + ` Network : ${t.settlement_network}`, + ` ⚠ ${t.warning}`, + bar, + "", + ]; + for (const s of t.steps) { + lines.push(`▶ ${s.step}`); + lines.push(` Timestamp : ${s.timestamp}`); + lines.push(` Status : ${s.status}`); + if (s.note) lines.push(` Note : ${s.note}`); + if (s.error) lines.push(` ERROR : ${s.error}`); + if (s.body) { + lines.push(" Body:"); + JSON.stringify(s.body, null, 2) + .split("\n") + .forEach((l) => lines.push(" " + l)); + } + lines.push(""); + } + lines.push(bar, " END OF DEMO TRANSCRIPT", bar); + return lines.join("\n"); +} + +function writeArtifact(t: Transcript): { json: string; txt: string } { + if (!fs.existsSync(OUT_DIR)) fs.mkdirSync(OUT_DIR, { recursive: true }); + + const slug = t.generated_at.replace(/[:.]/g, "-").replace("T", "_"); + const jsonPath = path.join(OUT_DIR, `demo-transcript-${slug}.json`); + const txtPath = path.join(OUT_DIR, `demo-transcript-${slug}.txt`); + + fs.writeFileSync(jsonPath, JSON.stringify(t, null, 2), "utf8"); + fs.writeFileSync(txtPath, toText(t), "utf8"); + return { json: jsonPath, txt: txtPath }; +} + +// --------------------------------------------------------------------------- +// Entry point +// --------------------------------------------------------------------------- +async function main(): Promise { + console.log("▶ Query402 transcript generator [DEMO_MODE=true]"); + console.log(` API: ${API_BASE}`); + console.log(""); + + const allSteps: Step[] = []; + + console.log(" [1/5] Health check…"); + allSteps.push(await step1Health()); + + console.log(" [2/5] Provider catalog…"); + allSteps.push(await step2Catalog()); + + console.log(" [3/5] Demo paid requests (search / news / scrape)…"); + const paidSteps = await step3PaidQueries(); + allSteps.push(...paidSteps); + + console.log(" [4/5] Response metadata…"); + allSteps.push(step4Metadata(paidSteps)); + + console.log(" [5/5] Analytics summary…"); + allSteps.push(await step5Analytics()); + + const transcript = assemble(allSteps); + const { json, txt } = writeArtifact(transcript); + + console.log(""); + console.log("✅ Transcript written:"); + console.log(` JSON : ${json}`); + console.log(` TXT : ${txt}`); + console.log(""); + console.log(" Label : DEMO_MODE (safe for SCF / Drips / investor notes)"); + console.log(" Secrets : all redacted"); + console.log(" Payment : no real Stellar transaction"); +} + +main().catch((err) => { + console.error("Fatal:", err); + process.exit(1); +}); \ No newline at end of file diff --git a/scripts/generate-demo-transcript.sh b/scripts/generate-demo-transcript.sh new file mode 100644 index 0000000..8f3c3f1 --- /dev/null +++ b/scripts/generate-demo-transcript.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# scripts/generate-demo-transcript.sh +# +# Generates a sanitized, deterministic demo transcript for Query402. +# Calls transcript.ts (NOT demo.ts — that is the console runner). +# +# MODE 1 — API already running: +# DEMO_MODE=true ./scripts/generate-demo-transcript.sh +# +# MODE 2 — Fully automated (starts + stops API): +# DEMO_MODE=true CI_OFFLINE=true ./scripts/generate-demo-transcript.sh + +set -euo pipefail + +DEMO_MODE="${DEMO_MODE:-true}" +CI_OFFLINE="${CI_OFFLINE:-false}" +API_BASE="${API_BASE_URL:-http://localhost:3001}" +API_PID="" + +green() { printf '\033[0;32m%s\033[0m\n' "$*"; } +yellow() { printf '\033[0;33m%s\033[0m\n' "$*"; } +red() { printf '\033[0;31m%s\033[0m\n' "$*"; } + +if [[ "$DEMO_MODE" != "true" ]]; then + red "ERROR: DEMO_MODE must be 'true'." + exit 1 +fi + +yellow "▶ Query402 demo transcript generator" +echo " DEMO_MODE : $DEMO_MODE" +echo " API_BASE : $API_BASE" +echo " CI_OFFLINE : $CI_OFFLINE" +echo "" + +if [[ "$CI_OFFLINE" == "true" ]]; then + yellow " Starting API in background…" + DEMO_MODE=true PORT_API=3001 NODE_ENV=test \ + npx --workspace @query402/api ts-node src/index.ts & + API_PID=$! + + echo -n " Waiting for /health" + for i in $(seq 1 30); do + if curl -sf "$API_BASE/health" > /dev/null 2>&1; then echo " ✓"; break; fi + echo -n "."; sleep 0.5 + done + + if ! curl -sf "$API_BASE/health" > /dev/null 2>&1; then + red " API did not become ready." + kill "$API_PID" 2>/dev/null || true + exit 1 + fi +fi + +cleanup() { + [[ -n "$API_PID" ]] && kill "$API_PID" 2>/dev/null || true +} +trap cleanup EXIT + +yellow " Running transcript.ts…" +DEMO_MODE=true API_BASE_URL="$API_BASE" \ + npm run demo:transcript --workspace @query402/agent-client + +yellow " Scanning for accidental secrets…" +LEAKED=0 +grep -rE 'S[A-Z0-9]{55}' transcript/ 2>/dev/null && LEAKED=1 || true +grep -riE 'Bearer [A-Za-z0-9._\-]{20,}' transcript/ 2>/dev/null && LEAKED=1 || true +grep -riE '(x-payment):\s*[A-Za-z0-9]{10,}' transcript/ 2>/dev/null && LEAKED=1 || true + +if [[ "$LEAKED" -eq 1 ]]; then + red " ✗ Secret detected — do NOT share this transcript." + exit 1 +fi + +green " ✓ No secrets detected." +echo "" +green "✅ Transcript ready in ./transcript/" \ No newline at end of file From ebb2abad16d860dfcbf2dc6b104a4d248af80761 Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Tue, 30 Jun 2026 21:22:07 +0000 Subject: [PATCH 10/19] chore: fix CI pipeline - formatting, dependency resolution, and lint upgrade --- .github/workflows/ci.yml | 2 +- apps/agent-client/package.json | 2 +- apps/agent-client/src/cli.test.ts | 2 +- apps/agent-client/src/cli.ts | 26 +- apps/agent-client/src/transcript.ts | 98 +- apps/api/src/lib/payment-evidence.ts | 1 - apps/api/src/lib/persistence.ts | 1 - apps/api/src/lib/storage/serialization.ts | 4 +- .../src/routes/protected.idempotency.test.ts | 5 +- .../src/routes/protected.validation.test.ts | 25 +- apps/api/src/routes/public.test.ts | 1 - apps/web/package.json | 2 +- package-lock.json | 969 +++++------------- package.json | 2 +- scripts/check-payment-leaks.mjs | 19 +- 15 files changed, 344 insertions(+), 815 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d691d2..4067388 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -132,4 +132,4 @@ jobs: - name: Stop API if: always() run: | - [[ -n "${API_PID:-}" ]] && kill "$API_PID" 2>/dev/null || true \ No newline at end of file + [[ -n "${API_PID:-}" ]] && kill "$API_PID" 2>/dev/null || true diff --git a/apps/agent-client/package.json b/apps/agent-client/package.json index 524c427..3e549a8 100644 --- a/apps/agent-client/package.json +++ b/apps/agent-client/package.json @@ -33,4 +33,4 @@ "typescript": "^5.8.3", "vitest": "^3.2.4" } -} \ No newline at end of file +} diff --git a/apps/agent-client/src/cli.test.ts b/apps/agent-client/src/cli.test.ts index 82e4197..c4a9be7 100644 --- a/apps/agent-client/src/cli.test.ts +++ b/apps/agent-client/src/cli.test.ts @@ -54,7 +54,7 @@ describe("formatSummary", () => { asset: "USDC", traceId: "trace-abc-123", evidenceId: "ev-xyz-789", - latencyMs: 342, + latencyMs: 342 }; it("includes mode and provider", () => { diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 0d91d85..a6a3518 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -17,22 +17,20 @@ export interface SummaryInput { /** Formats the post-query summary table. Pure function — safe to unit-test directly. */ export function formatSummary(input: SummaryInput): string { const rows: [string, string][] = [ - ["Mode", input.mode], - ["Provider", input.provider], - ["Status", String(input.status)], - ["Client", input.isDemoMode ? "demo" : "real"], + ["Mode", input.mode], + ["Provider", input.provider], + ["Status", String(input.status)], + ["Client", input.isDemoMode ? "demo" : "real"], ["Price (USD)", input.priceUsd != null ? String(input.priceUsd) : "n/a"], - ["Asset", input.asset ?? "n/a"], - ["Trace ID", input.traceId ?? "unavailable"], - ["Evidence ID", input.evidenceId ?? "unavailable"], + ["Asset", input.asset ?? "n/a"], + ["Trace ID", input.traceId ?? "unavailable"], + ["Evidence ID", input.evidenceId ?? "unavailable"] ]; if (input.latencyMs != null) { rows.push(["Latency", `${input.latencyMs}ms`]); } const labelWidth = Math.max(...rows.map(([label]) => label.length)); - const body = rows - .map(([label, value]) => ` ${label.padEnd(labelWidth)} ${value}`) - .join("\n"); + const body = rows.map(([label, value]) => ` ${label.padEnd(labelWidth)} ${value}`).join("\n"); const divider = "=".repeat(labelWidth + 4 + 20); return `\n=== Query402 Paid Query Summary ===\n${body}\n${divider}`; } @@ -88,8 +86,10 @@ async function main() { const latencyMs = Date.now() - start; const payload = result.body as Record; - const resultBlock = (payload?.result ?? (payload?.body as Record)?.result) as Record | undefined; - const evidenceBlock = (payload?.payment as Record)?.evidence as Record | undefined; + const resultBlock = (payload?.result ?? (payload?.body as Record)?.result) as + Record | undefined; + const evidenceBlock = (payload?.payment as Record)?.evidence as + Record | undefined; console.log( formatSummary({ @@ -101,7 +101,7 @@ async function main() { asset: (evidenceBlock?.proofLinks as Record | undefined)?.asset, traceId: resultBlock?.traceId as string | undefined, evidenceId: (evidenceBlock?.id ?? evidenceBlock?.evidenceId) as string | undefined, - latencyMs, + latencyMs }) ); } diff --git a/apps/agent-client/src/transcript.ts b/apps/agent-client/src/transcript.ts index aaea821..77604c6 100644 --- a/apps/agent-client/src/transcript.ts +++ b/apps/agent-client/src/transcript.ts @@ -37,9 +37,7 @@ const OUT_DIR = path.resolve(__dirname, "../../../transcript"); // Guard: refuse to run outside DEMO_MODE // --------------------------------------------------------------------------- if (config.DEMO_MODE !== "true") { - console.error( - "ERROR: Set DEMO_MODE=true to generate a transcript without live credentials." - ); + console.error("ERROR: Set DEMO_MODE=true to generate a transcript without live credentials."); process.exit(1); } @@ -49,10 +47,10 @@ const API_BASE = config.API_BASE_URL.replace(/\/$/, ""); // Secret redaction // --------------------------------------------------------------------------- const SECRET_PATTERNS: RegExp[] = [ - /S[A-Z0-9]{55}/g, // Stellar secret key (starts with S, 56 chars) - /Bearer\s+\S+/gi, // Bearer tokens - /x-payment:\s*\S+/gi, // raw payment header value - /X402-Payment:\s*\S+/gi, + /S[A-Z0-9]{55}/g, // Stellar secret key (starts with S, 56 chars) + /Bearer\s+\S+/gi, // Bearer tokens + /x-payment:\s*\S+/gi, // raw payment header value + /X402-Payment:\s*\S+/gi ]; const REDACTED = "[REDACTED]"; @@ -61,7 +59,7 @@ const SENSITIVE_HEADER_KEYS = new Set([ "x402-payment", "authorization", "x-api-key", - "payment-response", // raw tx ID; replaced with presence flag below + "payment-response" // raw tx ID; replaced with presence flag below ]); const SENSITIVE_OBJ_KEYS = new Set([ @@ -71,7 +69,7 @@ const SENSITIVE_OBJ_KEYS = new Set([ "private_key", "privatekey", "api_key", - "apikey", + "apikey" ]); function redact(value: unknown): unknown { @@ -117,15 +115,21 @@ interface RawResult { function httpGet(url: string): Promise { return new Promise((resolve, reject) => { - http.get(url, (res) => { - let raw = ""; - res.on("data", (chunk: Buffer) => (raw += chunk.toString())); - res.on("end", () => { - let body: unknown; - try { body = JSON.parse(raw); } catch { body = raw; } - resolve({ status: res.statusCode ?? 0, headers: res.headers, body }); - }); - }).on("error", reject); + http + .get(url, (res) => { + let raw = ""; + res.on("data", (chunk: Buffer) => (raw += chunk.toString())); + res.on("end", () => { + let body: unknown; + try { + body = JSON.parse(raw); + } catch { + body = raw; + } + resolve({ status: res.statusCode ?? 0, headers: res.headers, body }); + }); + }) + .on("error", reject); }); } @@ -167,9 +171,7 @@ async function step1Health(): Promise { responseHeaders: safeHeaders(r.headers), body: redact(r.body), note: - r.status === 200 - ? "API is healthy and ready." - : "API responded but may not be fully ready.", + r.status === 200 ? "API is healthy and ready." : "API responded but may not be fully ready." }; } catch (err) { return { @@ -177,7 +179,7 @@ async function step1Health(): Promise { timestamp, status: "n/a", error: `Could not reach ${API_BASE}/health — is the API running? (${err})`, - note: "Transcript is still written for CI evidence purposes.", + note: "Transcript is still written for CI evidence purposes." }; } } @@ -192,14 +194,14 @@ async function step2Catalog(): Promise { status: r.status, responseHeaders: safeHeaders(r.headers), body: redact(r.body), - note: "Available search/news/scrape providers with per-request pricing.", + note: "Available search/news/scrape providers with per-request pricing." }; } catch (err) { return { step: "2_provider_catalog", timestamp, status: "n/a", - error: String(err), + error: String(err) }; } } @@ -210,9 +212,9 @@ async function step2Catalog(): Promise { */ async function step3PaidQueries(): Promise { const queries: Array[0]> = [ - { mode: "search", provider: "search.pro", query: "latest stellar x402 updates" }, - { mode: "news", provider: "news.deep", query: "stablecoin micropayments" }, - { mode: "scrape", provider: "scrape.extract", url: "https://developers.stellar.org" }, + { mode: "search", provider: "search.pro", query: "latest stellar x402 updates" }, + { mode: "news", provider: "news.deep", query: "stablecoin micropayments" }, + { mode: "scrape", provider: "scrape.extract", url: "https://developers.stellar.org" } ]; const steps: Step[] = []; @@ -225,24 +227,24 @@ async function step3PaidQueries(): Promise { try { const response = await runPaidQuery(q); const payload = response.body as Record | undefined; - const result = payload?.result as Record | undefined; + const result = payload?.result as Record | undefined; steps.push({ step: label, timestamp, status: response.status, body: redact({ - provider: q.provider, - endpoint: response.endpoint, + provider: q.provider, + endpoint: response.endpoint, // Never write the raw payment-response header value; record presence only payment_response_present: Boolean(response.paymentResponse), - price_usd: result?.priceUsd ?? "n/a", - items_returned: Array.isArray(result?.items) ? result.items.length : 0, - result_body: payload, + price_usd: result?.priceUsd ?? "n/a", + items_returned: Array.isArray(result?.items) ? result.items.length : 0, + result_body: payload }), note: "DEMO_MODE=true — payment header contains a placeholder tx ID; " + - "no real Stellar transaction is submitted or settled.", + "no real Stellar transaction is submitted or settled." }); } catch (err) { steps.push({ step: label, timestamp, status: "n/a", error: String(err) }); @@ -254,21 +256,21 @@ async function step3PaidQueries(): Promise { function step4Metadata(paidSteps: Step[]): Step { const first = paidSteps.find((s) => s.status !== "n/a"); - const body = first?.body as Record | undefined; + const body = first?.body as Record | undefined; return { step: "4_response_metadata", timestamp: new Date().toISOString(), status: "n/a", body: { - provider: body?.provider ?? "search.pro", - price_usd: body?.price_usd ?? "n/a", + provider: body?.provider ?? "search.pro", + price_usd: body?.price_usd ?? "n/a", settlement_network: "stellar:testnet", - payment_status: "DEMO — no real Stellar settlement", + payment_status: "DEMO — no real Stellar settlement", note: "In production this section contains the facilitator-signed " + - "payment-response header. Here it is intentionally omitted.", + "payment-response header. Here it is intentionally omitted." }, - note: "Synthesised from paid-query responses. No secrets included.", + note: "Synthesised from paid-query responses. No secrets included." }; } @@ -282,14 +284,14 @@ async function step5Analytics(): Promise { status: r.status, responseHeaders: safeHeaders(r.headers), body: redact(r.body), - note: "Total spend + per-category breakdown stored in SQLite.", + note: "Total spend + per-category breakdown stored in SQLite." }; } catch (err) { return { step: "5_analytics_summary", timestamp, status: "n/a", - error: String(err), + error: String(err) }; } } @@ -308,7 +310,7 @@ function assemble(steps: Step[]): Transcript { "Generated in DEMO_MODE. No real Stellar credentials or live payments " + "were used. All secret fields are redacted. " + "Safe to attach to Drips/SCF updates and investor notes.", - steps, + steps }; } @@ -323,13 +325,13 @@ function toText(t: Transcript): string { ` Network : ${t.settlement_network}`, ` ⚠ ${t.warning}`, bar, - "", + "" ]; for (const s of t.steps) { lines.push(`▶ ${s.step}`); lines.push(` Timestamp : ${s.timestamp}`); lines.push(` Status : ${s.status}`); - if (s.note) lines.push(` Note : ${s.note}`); + if (s.note) lines.push(` Note : ${s.note}`); if (s.error) lines.push(` ERROR : ${s.error}`); if (s.body) { lines.push(" Body:"); @@ -348,10 +350,10 @@ function writeArtifact(t: Transcript): { json: string; txt: string } { const slug = t.generated_at.replace(/[:.]/g, "-").replace("T", "_"); const jsonPath = path.join(OUT_DIR, `demo-transcript-${slug}.json`); - const txtPath = path.join(OUT_DIR, `demo-transcript-${slug}.txt`); + const txtPath = path.join(OUT_DIR, `demo-transcript-${slug}.txt`); fs.writeFileSync(jsonPath, JSON.stringify(t, null, 2), "utf8"); - fs.writeFileSync(txtPath, toText(t), "utf8"); + fs.writeFileSync(txtPath, toText(t), "utf8"); return { json: jsonPath, txt: txtPath }; } @@ -397,4 +399,4 @@ async function main(): Promise { main().catch((err) => { console.error("Fatal:", err); process.exit(1); -}); \ No newline at end of file +}); diff --git a/apps/api/src/lib/payment-evidence.ts b/apps/api/src/lib/payment-evidence.ts index b850eee..295d0c2 100644 --- a/apps/api/src/lib/payment-evidence.ts +++ b/apps/api/src/lib/payment-evidence.ts @@ -371,7 +371,6 @@ export async function persistPaymentEvidence( facilitatorUrl: evidence.facilitatorUrl, payerPublicKey: evidence.payer, traceId: record.traceId, - errorCode: evidence.kind === "failed" ? "payment_invalid" : undefined, createdAt: now, latencyMs: record.latencyMs }; diff --git a/apps/api/src/lib/persistence.ts b/apps/api/src/lib/persistence.ts index 75b2c28..c3c6f4d 100644 --- a/apps/api/src/lib/persistence.ts +++ b/apps/api/src/lib/persistence.ts @@ -97,7 +97,6 @@ function buildUsageEvent( facilitatorUrl: config.X402_FACILITATOR_URL, payerPublicKey: input.payerPublicKey, traceId: input.traceId, - errorCode: input.errorCode as any, createdAt: now, latencyMs: input.latencyMs, execution: input.execution, diff --git a/apps/api/src/lib/storage/serialization.ts b/apps/api/src/lib/storage/serialization.ts index 1e25bd1..a4fb243 100644 --- a/apps/api/src/lib/storage/serialization.ts +++ b/apps/api/src/lib/storage/serialization.ts @@ -217,9 +217,7 @@ export function rowToUsageEvent(row: Record): UsageEvent { : undefined, sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined, priceOutlier: priceOutlier || undefined, - priceOutlierReason: row.price_outlier_reason - ? String(row.price_outlier_reason) - : undefined + priceOutlierReason: row.price_outlier_reason ? String(row.price_outlier_reason) : undefined }; } diff --git a/apps/api/src/routes/protected.idempotency.test.ts b/apps/api/src/routes/protected.idempotency.test.ts index 4377106..46ab219 100644 --- a/apps/api/src/routes/protected.idempotency.test.ts +++ b/apps/api/src/routes/protected.idempotency.test.ts @@ -2,10 +2,7 @@ import { randomUUID } from "node:crypto"; import express from "express"; import request from "supertest"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { - applyApiTestEnv, - resetApiTestStorage -} from "../test/api-test-helpers.js"; +import { applyApiTestEnv, resetApiTestStorage } from "../test/api-test-helpers.js"; const executeQueryMock = vi.fn(); diff --git a/apps/api/src/routes/protected.validation.test.ts b/apps/api/src/routes/protected.validation.test.ts index f43b44c..791c069 100644 --- a/apps/api/src/routes/protected.validation.test.ts +++ b/apps/api/src/routes/protected.validation.test.ts @@ -55,23 +55,36 @@ describe("protected route validation and error handling", () => { const { protectedRouter } = await import("../routes/protected.js"); const { UnsafeScrapeUrlError } = await import("../lib/scrape-url-safety.js"); const { PaymentEvidenceError } = await import("../lib/payment-evidence.js"); - const { ProviderTimeoutError, ProviderFailedError } = await import("../services/query-service.js"); + const { ProviderTimeoutError, ProviderFailedError } = + await import("../services/query-service.js"); const app = express(); app.use(protectedRouter); app.use((error: any, _req: any, res: any, _next: any) => { if (error instanceof UnsafeScrapeUrlError) { - return res.status(400).json({ error: error.message, type: "unsafe_scrape_url", errorCode: "invalid_query" }); + return res + .status(400) + .json({ error: error.message, type: "unsafe_scrape_url", errorCode: "invalid_query" }); } if (error instanceof PaymentEvidenceError) { - return res.status(400).json({ error: error.message, type: "payment_evidence_error", errorCode: "payment_invalid" }); + return res.status(400).json({ + error: error.message, + type: "payment_evidence_error", + errorCode: "payment_invalid" + }); } if (error instanceof ProviderTimeoutError) { - return res.status(504).json({ error: error.message, type: "provider_timeout", errorCode: "provider_timeout" }); + return res + .status(504) + .json({ error: error.message, type: "provider_timeout", errorCode: "provider_timeout" }); } if (error instanceof ProviderFailedError) { - return res.status(502).json({ error: error.message, type: "provider_failed", errorCode: "provider_failed" }); + return res + .status(502) + .json({ error: error.message, type: "provider_failed", errorCode: "provider_failed" }); } - return res.status(500).json({ error: error.message, type: "internal_error", errorCode: "internal_error" }); + return res + .status(500) + .json({ error: error.message, type: "internal_error", errorCode: "internal_error" }); }); return app; } diff --git a/apps/api/src/routes/public.test.ts b/apps/api/src/routes/public.test.ts index 53a3a67..7ebdd5f 100644 --- a/apps/api/src/routes/public.test.ts +++ b/apps/api/src/routes/public.test.ts @@ -201,5 +201,4 @@ describe("public routes", () => { expect(catalogResponse.body.byCategory.news.length).toBeGreaterThan(0); expect(catalogResponse.body.byCategory.scrape.length).toBeGreaterThan(0); }); - }); diff --git a/apps/web/package.json b/apps/web/package.json index a770344..faeaaf9 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -30,7 +30,7 @@ "@types/node": "^22.20.0", "@types/react": "^18.3.20", "@types/react-dom": "^18.3.7", - "@vitejs/plugin-react": "^4.4.1", + "@vitejs/plugin-react": "^4.7.0", "autoprefixer": "^10.4.21", "postcss": "^8.5.3", "tailwindcss": "^3.4.17", diff --git a/package-lock.json b/package-lock.json index 96cb307..0980d38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "eslint-config-prettier": "^10.1.5", "prettier": "^3.5.3", "typescript": "^5.8.3", - "typescript-eslint": "^8.32.1" + "typescript-eslint": "^8.62.1" }, "engines": { "node": ">=20.0.0 <25.0.0" @@ -93,7 +93,7 @@ "@types/node": "^22.20.0", "@types/react": "^18.3.20", "@types/react-dom": "^18.3.7", - "@vitejs/plugin-react": "^4.4.1", + "@vitejs/plugin-react": "^4.7.0", "autoprefixer": "^10.4.21", "postcss": "^8.5.3", "tailwindcss": "^3.4.17", @@ -105,6 +105,22 @@ "@rollup/rollup-linux-x64-gnu": "^4.60.1" } }, + "apps/web/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@adraffy/ens-normalize": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", @@ -480,7 +496,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -498,7 +513,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -516,7 +530,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -534,7 +547,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -552,7 +564,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -570,7 +581,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -588,7 +598,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -606,7 +615,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -624,7 +632,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -642,7 +649,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -660,7 +666,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -678,7 +683,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -696,7 +700,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -714,7 +717,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -732,7 +734,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -750,7 +751,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -768,7 +768,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -786,7 +785,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -804,7 +802,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -822,7 +819,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -840,7 +836,6 @@ "os": [ "openharmony" ], - "peer": true, "engines": { "node": ">=18" } @@ -858,7 +853,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } @@ -876,7 +870,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -894,7 +887,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -912,7 +904,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -1399,6 +1390,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1594,7 +1586,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1768,8 +1759,6 @@ }, "node_modules/@stellar/freighter-api": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-6.0.1.tgz", - "integrity": "sha512-eqwakEqSg+zoLuPpSbKyrX0pG8DQFzL/J5GtbfuMCmJI+h+oiC9pQ5C6QLc80xopZQKdGt8dUAFCmDMNdAG95w==", "license": "Apache-2.0", "dependencies": { "buffer": "6.0.3", @@ -1778,8 +1767,6 @@ }, "node_modules/@stellar/freighter-api/node_modules/semver": { "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1790,8 +1777,6 @@ }, "node_modules/@stellar/js-xdr": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-4.0.0.tgz", - "integrity": "sha512-+NmNa7Tk5BI5XFdy/6xGTqAN4J9a9KgCrCGhj2uEUTCBhLkch0M+QbKzNH8zEnejWe0p8w+0q5hUVX6L3OzoVA==", "license": "Apache-2.0", "engines": { "node": ">=20.0.0", @@ -1800,9 +1785,6 @@ }, "node_modules/@stellar/stellar-base": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-15.0.0.tgz", - "integrity": "sha512-XQhxUr9BYiEcFcgc4oWcCMR9QJCny/GmmGsuwPKf/ieIcOeb5149KLHYx9mJCA0ea8QbucR2/GzV58QbXOTxQA==", - "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.9.7", @@ -1817,13 +1799,11 @@ } }, "node_modules/@stellar/stellar-sdk": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-15.1.0.tgz", - "integrity": "sha512-GsJUcWx2yboVzYdhTe/LHS3V1wVLSHkUkglC5bBoYWGJt31vzIhbSGno60NP9CdCTNkLJdnrsLJ63oA58Zvh5A==", + "version": "15.0.1", "license": "Apache-2.0", "dependencies": { "@stellar/stellar-base": "^15.0.0", - "axios": "1.15.0", + "axios": "1.14.0", "bignumber.js": "^9.3.1", "commander": "^14.0.3", "eventsource": "^2.0.2", @@ -1886,8 +1866,6 @@ }, "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": { @@ -1896,8 +1874,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1907,8 +1883,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": { @@ -1918,8 +1892,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -1928,15 +1900,11 @@ }, "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/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -1945,22 +1913,16 @@ }, "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.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "version": "1.0.8", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -1971,8 +1933,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "dev": true, "license": "MIT", "dependencies": { @@ -1984,8 +1944,6 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -1998,8 +1956,6 @@ }, "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" }, @@ -2015,29 +1971,21 @@ }, "node_modules/@types/prop-types": { "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "version": "6.15.0", "dev": true, "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==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "version": "18.3.28", "dev": true, "license": "MIT", "dependencies": { @@ -2047,8 +1995,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2057,8 +2003,6 @@ }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2067,8 +2011,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2078,8 +2020,6 @@ }, "node_modules/@types/superagent": { "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.10.tgz", - "integrity": "sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==", "dev": true, "license": "MIT", "dependencies": { @@ -2091,8 +2031,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": { @@ -2101,330 +2039,265 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", - "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==", + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz", + "integrity": "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==", "dev": true, "license": "MIT", "dependencies": { - "@noble/hashes": "^1.7.0", - "apg-js": "^4.4.0" - } - }, - "node_modules/@stellar/freighter-api": { - "version": "6.0.1", - "license": "Apache-2.0", - "dependencies": { - "buffer": "6.0.3", - "semver": "7.7.1" - } - }, - "node_modules/@stellar/freighter-api/node_modules/semver": { - "version": "7.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/type-utils": "8.62.1", + "@typescript-eslint/utils": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.62.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@stellar/js-xdr": { - "version": "4.0.0", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/eslint-plugin/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": { - "node": ">=20.0.0", - "pnpm": ">=9.0.0" + "node": ">= 4" } }, - "node_modules/@stellar/stellar-base": { - "version": "15.0.0", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/parser": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz", + "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==", + "dev": true, + "license": "MIT", "dependencies": { - "@noble/curves": "^1.9.7", - "@stellar/js-xdr": "^4.0.0", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3" }, "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@stellar/stellar-sdk": { - "version": "15.0.1", - "license": "Apache-2.0", - "dependencies": { - "@stellar/stellar-base": "^15.0.0", - "axios": "1.14.0", - "bignumber.js": "^9.3.1", - "commander": "^14.0.3", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.11" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "bin": { - "stellar-js": "bin/stellar-js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=20.0.0" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", + "node_modules/@typescript-eslint/project-service": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz", + "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz", + "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz", + "integrity": "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz", + "integrity": "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/utils": "8.62.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.13", + "node_modules/@typescript-eslint/types": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", + "integrity": "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz", + "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/chai": { - "version": "5.2.3", + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@types/connect": { - "version": "3.4.38", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.19", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/node": "*" + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "5.0.6", + "node_modules/@typescript-eslint/utils": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz", + "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", "dev": true, "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz", + "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "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/methods": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.20.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", - "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.15.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/superagent": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/supertest": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", - "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/type-utils": "8.62.0", - "@typescript-eslint/utils": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.62.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz", - "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "debug": "^4.4.3" + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2432,50 +2305,19 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", - "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.0", - "@typescript-eslint/types": "^8.62.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", - "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, "node_modules/@vitejs/plugin-react": { @@ -2484,15 +2326,19 @@ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@vitest/coverage-v8": { @@ -2789,36 +2635,6 @@ "integrity": "sha512-AJ9dSeaUGj2xu7tEwmdqb51dqdb633xo4njI9K8ZFfcLrNr0XN8/EPkkZUNaF9fkCblGt2zVwZymesUdGynEkQ==", "license": "MIT" }, - "node_modules/@x402/stellar/node_modules/eventsource": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", - "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@x402/stellar/node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/@x402/stellar/node_modules/bignumber.js": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.4.tgz", - "integrity": "sha512-AJ9dSeaUGj2xu7tEwmdqb51dqdb633xo4njI9K8ZFfcLrNr0XN8/EPkkZUNaF9fkCblGt2zVwZymesUdGynEkQ==", - "license": "MIT" - }, "node_modules/@x402/stellar/node_modules/eventsource": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", @@ -4010,20 +3826,6 @@ "@esbuild/win32-x64": "0.28.1" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/escalade": { "version": "3.2.0", "dev": true, @@ -7767,16 +7569,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.62.0.tgz", - "integrity": "sha512-8QxXi+ZACKX0kaqO4gY8kn0RSD9gFfaHDWwjqtEN48aWCBkX4MJaufWN+c3BzlrXLOxfywDL8CaoqUwcRq4j4Q==", + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.62.1.tgz", + "integrity": "sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.62.0", - "@typescript-eslint/parser": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/utils": "8.62.0" + "@typescript-eslint/eslint-plugin": "8.62.1", + "@typescript-eslint/parser": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/utils": "8.62.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8399,295 +8201,6 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", diff --git a/package.json b/package.json index 3a6eb0f..77d5955 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,6 @@ "eslint-config-prettier": "^10.1.5", "prettier": "^3.5.3", "typescript": "^5.8.3", - "typescript-eslint": "^8.32.1" + "typescript-eslint": "^8.62.1" } } diff --git a/scripts/check-payment-leaks.mjs b/scripts/check-payment-leaks.mjs index 050607d..90672fe 100644 --- a/scripts/check-payment-leaks.mjs +++ b/scripts/check-payment-leaks.mjs @@ -45,7 +45,8 @@ function findLeaks(content) { } // 4. Facilitator API Key - const facilitatorKeyRegex = /(?:facilitator.*api.*key|x402.*facilitator.*api.*key)\s*[:=]\s*["']?([a-zA-Z0-9_\-]+)["']?/gi; + const facilitatorKeyRegex = + /(?:facilitator.*api.*key|x402.*facilitator.*api.*key)\s*[:=]\s*["']?([a-zA-Z0-9_\-]+)["']?/gi; while ((match = facilitatorKeyRegex.exec(line)) !== null) { const val = match[1]; const isRedacted = @@ -61,7 +62,8 @@ function findLeaks(content) { } // 5. X-Payment Header or payment-response header - const paymentHeaderRegex = /(?:x-payment|payment-response|x-payment-response)\s*[:=]\s*["']?([a-zA-Z0-9_\-\[\]\+\/=]+)["']?/gi; + const paymentHeaderRegex = + /(?:x-payment|payment-response|x-payment-response)\s*[:=]\s*["']?([a-zA-Z0-9_\-\[\]\+\/=]+)["']?/gi; while ((match = paymentHeaderRegex.exec(line)) !== null) { const val = match[1]; const isRedacted = @@ -71,7 +73,9 @@ function findLeaks(content) { val.endsWith("]") || val.startsWith("demo_tx_") || val.startsWith("demo-proof-") || - ["none", "", "tx_test", "proof_123", "demo-proof-news", "demo-proof-scrape"].includes(val.toLowerCase()); + ["none", "", "tx_test", "proof_123", "demo-proof-news", "demo-proof-scrape"].includes( + val.toLowerCase() + ); if (!isRedacted) { leaks.push({ lineNum, pattern: "X-Payment Header", match: val }); } @@ -150,12 +154,17 @@ function runSelfTest() { for (const fail of failingCases) { const leaks = findLeaks(fail.text); if (leaks.length === 0) { - console.error(`Self-test failed: Expected leak for pattern "${fail.pattern}" in "${fail.text}", but none found.`); + console.error( + `Self-test failed: Expected leak for pattern "${fail.pattern}" in "${fail.text}", but none found.` + ); process.exit(1); } const hasPattern = leaks.some((l) => l.pattern === fail.pattern); if (!hasPattern) { - console.error(`Self-test failed: Expected leak of type "${fail.pattern}" in "${fail.text}", but found different type:`, leaks); + console.error( + `Self-test failed: Expected leak of type "${fail.pattern}" in "${fail.text}", but found different type:`, + leaks + ); process.exit(1); } } From 79f68ad1e7822fdd7244aa25b7298fb10fd118c4 Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 14:44:43 +0000 Subject: [PATCH 11/19] chore: regenerate package-lock.json to sync with updated deps (typescript-eslint@8.62.1, @vitejs/plugin-react@4.3.4) --- package-lock.json | 1027 +++++++++++---------------------------------- 1 file changed, 245 insertions(+), 782 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7eae359..7d34e47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "@types/node": "^22.20.0", "@types/react": "^18.3.20", "@types/react-dom": "^18.3.7", - "@vitejs/plugin-react": "^4.7.0", + "@vitejs/plugin-react": "4.3.4", "autoprefixer": "^10.4.21", "postcss": "^8.5.3", "tailwindcss": "^3.4.17", @@ -121,6 +121,36 @@ "node": ">=12" } }, + "apps/web/node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "apps/web/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@adraffy/ens-normalize": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", @@ -496,7 +526,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -514,7 +543,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -532,7 +560,6 @@ "os": [ "android" ], - "peer": true, "engines": { "node": ">=18" } @@ -550,7 +577,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -568,7 +594,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": ">=18" } @@ -586,7 +611,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -604,7 +628,6 @@ "os": [ "freebsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -622,7 +645,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -640,7 +662,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -658,7 +679,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -676,7 +696,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -694,7 +713,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -712,7 +730,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -730,7 +747,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -748,7 +764,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -766,7 +781,6 @@ "os": [ "linux" ], - "peer": true, "engines": { "node": ">=18" } @@ -784,7 +798,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -802,7 +815,6 @@ "os": [ "netbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -820,7 +832,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -838,7 +849,6 @@ "os": [ "openbsd" ], - "peer": true, "engines": { "node": ">=18" } @@ -856,7 +866,6 @@ "os": [ "openharmony" ], - "peer": true, "engines": { "node": ">=18" } @@ -874,7 +883,6 @@ "os": [ "sunos" ], - "peer": true, "engines": { "node": ">=18" } @@ -892,7 +900,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -910,7 +917,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -928,7 +934,6 @@ "os": [ "win32" ], - "peer": true, "engines": { "node": ">=18" } @@ -1359,13 +1364,6 @@ "node": ">=14.0.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.62.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", @@ -1611,7 +1609,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1785,8 +1782,6 @@ }, "node_modules/@stellar/freighter-api": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@stellar/freighter-api/-/freighter-api-6.0.1.tgz", - "integrity": "sha512-eqwakEqSg+zoLuPpSbKyrX0pG8DQFzL/J5GtbfuMCmJI+h+oiC9pQ5C6QLc80xopZQKdGt8dUAFCmDMNdAG95w==", "license": "Apache-2.0", "dependencies": { "buffer": "6.0.3", @@ -1795,8 +1790,6 @@ }, "node_modules/@stellar/freighter-api/node_modules/semver": { "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -1807,8 +1800,6 @@ }, "node_modules/@stellar/js-xdr": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@stellar/js-xdr/-/js-xdr-4.0.0.tgz", - "integrity": "sha512-+NmNa7Tk5BI5XFdy/6xGTqAN4J9a9KgCrCGhj2uEUTCBhLkch0M+QbKzNH8zEnejWe0p8w+0q5hUVX6L3OzoVA==", "license": "Apache-2.0", "engines": { "node": ">=20.0.0", @@ -1817,9 +1808,6 @@ }, "node_modules/@stellar/stellar-base": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-base/-/stellar-base-15.0.0.tgz", - "integrity": "sha512-XQhxUr9BYiEcFcgc4oWcCMR9QJCny/GmmGsuwPKf/ieIcOeb5149KLHYx9mJCA0ea8QbucR2/GzV58QbXOTxQA==", - "deprecated": "This package is now rolled into @stellar/stellar-sdk. Please use @stellar/stellar-sdk to continue receiving updates and support.", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.9.7", @@ -1834,13 +1822,11 @@ } }, "node_modules/@stellar/stellar-sdk": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/@stellar/stellar-sdk/-/stellar-sdk-15.1.0.tgz", - "integrity": "sha512-GsJUcWx2yboVzYdhTe/LHS3V1wVLSHkUkglC5bBoYWGJt31vzIhbSGno60NP9CdCTNkLJdnrsLJ63oA58Zvh5A==", + "version": "15.0.1", "license": "Apache-2.0", "dependencies": { "@stellar/stellar-base": "^15.0.0", - "axios": "1.15.0", + "axios": "1.14.0", "bignumber.js": "^9.3.1", "commander": "^14.0.3", "eventsource": "^2.0.2", @@ -1858,8 +1844,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==", "dev": true, "license": "MIT", "dependencies": { @@ -1872,8 +1856,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==", "dev": true, "license": "MIT", "dependencies": { @@ -1882,8 +1864,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==", "dev": true, "license": "MIT", "dependencies": { @@ -1893,8 +1873,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1903,8 +1881,6 @@ }, "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": { @@ -1913,8 +1889,6 @@ }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -1924,8 +1898,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": { @@ -1935,8 +1907,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -1945,15 +1915,11 @@ }, "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/cors": { "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -1962,22 +1928,16 @@ }, "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.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "version": "1.0.8", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", "dev": true, "license": "MIT", "dependencies": { @@ -1988,8 +1948,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", "dev": true, "license": "MIT", "dependencies": { @@ -2001,8 +1959,6 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -2015,8 +1971,6 @@ }, "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" }, @@ -2032,29 +1986,21 @@ }, "node_modules/@types/prop-types": { "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "version": "6.15.0", "dev": true, "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==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "version": "18.3.28", "dev": true, "license": "MIT", "dependencies": { @@ -2064,8 +2010,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2074,8 +2018,6 @@ }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2084,8 +2026,6 @@ }, "node_modules/@types/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2095,8 +2035,6 @@ }, "node_modules/@types/superagent": { "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.10.tgz", - "integrity": "sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==", "dev": true, "license": "MIT", "dependencies": { @@ -2108,8 +2046,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": { @@ -2124,392 +2060,279 @@ "dev": true, "license": "MIT", "dependencies": { - "@noble/hashes": "^1.7.0", - "apg-js": "^4.4.0" - } - }, - "node_modules/@stellar/freighter-api": { - "version": "6.0.1", - "license": "Apache-2.0", - "dependencies": { - "buffer": "6.0.3", - "semver": "7.7.1" - } - }, - "node_modules/@stellar/freighter-api/node_modules/semver": { - "version": "7.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/type-utils": "8.62.1", + "@typescript-eslint/utils": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.62.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@stellar/js-xdr": { - "version": "4.0.0", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/eslint-plugin/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": { - "node": ">=20.0.0", - "pnpm": ">=9.0.0" + "node": ">= 4" } }, - "node_modules/@stellar/stellar-base": { - "version": "15.0.0", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/parser": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz", + "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==", + "dev": true, + "license": "MIT", "dependencies": { - "@noble/curves": "^1.9.7", - "@stellar/js-xdr": "^4.0.0", - "base32.js": "^0.1.0", - "bignumber.js": "^9.3.1", - "buffer": "^6.0.3", - "sha.js": "^2.4.12" + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3" }, "engines": { - "node": ">=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@stellar/stellar-sdk": { - "version": "15.0.1", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz", + "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==", + "dev": true, + "license": "MIT", "dependencies": { - "@stellar/stellar-base": "^15.0.0", - "axios": "1.14.0", - "bignumber.js": "^9.3.1", - "commander": "^14.0.3", - "eventsource": "^2.0.2", - "feaxios": "^0.0.23", - "randombytes": "^2.1.0", - "toml": "^3.0.0", - "urijs": "^1.19.11" - }, - "bin": { - "stellar-js": "bin/stellar-js" + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1" }, "engines": { - "node": ">=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz", + "integrity": "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz", + "integrity": "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1", + "@typescript-eslint/utils": "8.62.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", + "node_modules/@typescript-eslint/types": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz", + "integrity": "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz", + "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@typescript-eslint/project-service": "8.62.1", + "@typescript-eslint/tsconfig-utils": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/visitor-keys": "8.62.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/better-sqlite3": { - "version": "7.6.13", + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz", + "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@typescript-eslint/tsconfig-utils": "^8.62.1", + "@typescript-eslint/types": "^8.62.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@types/chai": { - "version": "5.2.3", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/@types/connect": { - "version": "3.4.38", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "@types/node": "*" + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", + "node_modules/@typescript-eslint/utils": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz", + "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.62.1", + "@typescript-eslint/types": "8.62.1", + "@typescript-eslint/typescript-estree": "8.62.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } }, - "node_modules/@types/cors": { - "version": "2.8.19", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.62.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz", + "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "8.62.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "5.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "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/methods": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.20.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.0.tgz", - "integrity": "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.15.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.28", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/superagent": { - "version": "8.1.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/supertest": { - "version": "6.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", - "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/type-utils": "8.62.0", - "@typescript-eslint/utils": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.62.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz", - "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", - "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.0", - "@typescript-eslint/types": "^8.62.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", - "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "url": "https://opencollective.com/eslint" } }, "node_modules/@vitest/coverage-v8": { @@ -2806,36 +2629,6 @@ "integrity": "sha512-AJ9dSeaUGj2xu7tEwmdqb51dqdb633xo4njI9K8ZFfcLrNr0XN8/EPkkZUNaF9fkCblGt2zVwZymesUdGynEkQ==", "license": "MIT" }, - "node_modules/@x402/stellar/node_modules/eventsource": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", - "integrity": "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@x402/stellar/node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/@x402/stellar/node_modules/bignumber.js": { - "version": "11.1.4", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-11.1.4.tgz", - "integrity": "sha512-AJ9dSeaUGj2xu7tEwmdqb51dqdb633xo4njI9K8ZFfcLrNr0XN8/EPkkZUNaF9fkCblGt2zVwZymesUdGynEkQ==", - "license": "MIT" - }, "node_modules/@x402/stellar/node_modules/eventsource": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-4.1.0.tgz", @@ -4027,20 +3820,6 @@ "@esbuild/win32-x64": "0.28.1" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/escalade": { "version": "3.2.0", "dev": true, @@ -6553,16 +6332,6 @@ "react": "^18.3.1" } }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react-router": { "version": "6.30.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", @@ -8416,312 +8185,6 @@ "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", From 4f0cd9034749f18fbf64ee58c28ca993e5f47c0f Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 14:53:47 +0000 Subject: [PATCH 12/19] fix: remove duplicate version 4 migration entry that caused 'duplicate column name: price_outlier' error --- apps/api/src/lib/storage/sqlite/migrations.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/apps/api/src/lib/storage/sqlite/migrations.ts b/apps/api/src/lib/storage/sqlite/migrations.ts index 0a0ade6..ce59255 100644 --- a/apps/api/src/lib/storage/sqlite/migrations.ts +++ b/apps/api/src/lib/storage/sqlite/migrations.ts @@ -93,13 +93,6 @@ ALTER TABLE payment_attempts ADD COLUMN error_code TEXT; sql: ` ALTER TABLE usage_events ADD COLUMN price_outlier INTEGER; ALTER TABLE usage_events ADD COLUMN price_outlier_reason TEXT; -` - }, - { - version: 4, - sql: ` -ALTER TABLE usage_events ADD COLUMN price_outlier INTEGER; -ALTER TABLE usage_events ADD COLUMN price_outlier_reason TEXT; ` } ]; From e884c33221b5413ab433ca300e4e885c82d3fac9 Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 15:20:37 +0000 Subject: [PATCH 13/19] ci: trigger re-run after migration fix From da590bcff5b85526d58c79db77819b6cfe590636 Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 15:31:16 +0000 Subject: [PATCH 14/19] new fix --- apps/api/src/routes/public.test.ts | 14 ++++++++++++-- apps/api/src/test/storage-test-helpers.ts | 10 ++++++---- scripts/check-payment-leaks.mjs | 19 ++++++++++++++----- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/apps/api/src/routes/public.test.ts b/apps/api/src/routes/public.test.ts index 874a57e..dcb3186 100644 --- a/apps/api/src/routes/public.test.ts +++ b/apps/api/src/routes/public.test.ts @@ -271,8 +271,18 @@ describe("public routes", () => { const { persistPaymentAndUsage } = await import("../lib/persistence.js"); await persistPaymentAndUsage( buildPaidQueryFixture({ - payment: { id: "pay_fixture_demo_01", status: "demo-paid", evidenceKind: "demo", transactionHash: undefined }, - usage: { id: "use_fixture_demo_01", paymentStatus: "demo-paid", paymentKind: "demo", paymentTxHash: undefined } + payment: { + id: "pay_fixture_demo_01", + status: "demo-paid", + evidenceKind: "demo", + transactionHash: undefined + }, + usage: { + id: "use_fixture_demo_01", + paymentStatus: "demo-paid", + paymentKind: "demo", + paymentTxHash: undefined + } }) ); diff --git a/apps/api/src/test/storage-test-helpers.ts b/apps/api/src/test/storage-test-helpers.ts index d91ede4..3b11748 100644 --- a/apps/api/src/test/storage-test-helpers.ts +++ b/apps/api/src/test/storage-test-helpers.ts @@ -75,10 +75,12 @@ export function buildTestPaymentAttempt(overrides: Partial = {}) }; } -export function buildPaidQueryFixture(overrides: { - payment?: Partial; - usage?: Partial; -} = {}): PaidQueryFixture { +export function buildPaidQueryFixture( + overrides: { + payment?: Partial; + usage?: Partial; + } = {} +): PaidQueryFixture { const payment: PaymentAttempt = { id: "pay_fixture_0001", endpoint: "/x402/search", diff --git a/scripts/check-payment-leaks.mjs b/scripts/check-payment-leaks.mjs index 050607d..90672fe 100644 --- a/scripts/check-payment-leaks.mjs +++ b/scripts/check-payment-leaks.mjs @@ -45,7 +45,8 @@ function findLeaks(content) { } // 4. Facilitator API Key - const facilitatorKeyRegex = /(?:facilitator.*api.*key|x402.*facilitator.*api.*key)\s*[:=]\s*["']?([a-zA-Z0-9_\-]+)["']?/gi; + const facilitatorKeyRegex = + /(?:facilitator.*api.*key|x402.*facilitator.*api.*key)\s*[:=]\s*["']?([a-zA-Z0-9_\-]+)["']?/gi; while ((match = facilitatorKeyRegex.exec(line)) !== null) { const val = match[1]; const isRedacted = @@ -61,7 +62,8 @@ function findLeaks(content) { } // 5. X-Payment Header or payment-response header - const paymentHeaderRegex = /(?:x-payment|payment-response|x-payment-response)\s*[:=]\s*["']?([a-zA-Z0-9_\-\[\]\+\/=]+)["']?/gi; + const paymentHeaderRegex = + /(?:x-payment|payment-response|x-payment-response)\s*[:=]\s*["']?([a-zA-Z0-9_\-\[\]\+\/=]+)["']?/gi; while ((match = paymentHeaderRegex.exec(line)) !== null) { const val = match[1]; const isRedacted = @@ -71,7 +73,9 @@ function findLeaks(content) { val.endsWith("]") || val.startsWith("demo_tx_") || val.startsWith("demo-proof-") || - ["none", "", "tx_test", "proof_123", "demo-proof-news", "demo-proof-scrape"].includes(val.toLowerCase()); + ["none", "", "tx_test", "proof_123", "demo-proof-news", "demo-proof-scrape"].includes( + val.toLowerCase() + ); if (!isRedacted) { leaks.push({ lineNum, pattern: "X-Payment Header", match: val }); } @@ -150,12 +154,17 @@ function runSelfTest() { for (const fail of failingCases) { const leaks = findLeaks(fail.text); if (leaks.length === 0) { - console.error(`Self-test failed: Expected leak for pattern "${fail.pattern}" in "${fail.text}", but none found.`); + console.error( + `Self-test failed: Expected leak for pattern "${fail.pattern}" in "${fail.text}", but none found.` + ); process.exit(1); } const hasPattern = leaks.some((l) => l.pattern === fail.pattern); if (!hasPattern) { - console.error(`Self-test failed: Expected leak of type "${fail.pattern}" in "${fail.text}", but found different type:`, leaks); + console.error( + `Self-test failed: Expected leak of type "${fail.pattern}" in "${fail.text}", but found different type:`, + leaks + ); process.exit(1); } } From 15fab099671a06f0f6faf92a664af3e16e76e1f0 Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 15:37:14 +0000 Subject: [PATCH 15/19] new fixxing --- apps/agent-client/src/validate-real.test.ts | 6 +++--- apps/agent-client/src/validate-real.ts | 18 ++++++++++++------ apps/api/src/lib/storage/serialization.ts | 4 +--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/apps/agent-client/src/validate-real.test.ts b/apps/agent-client/src/validate-real.test.ts index a06b73f..0d2d556 100644 --- a/apps/agent-client/src/validate-real.test.ts +++ b/apps/agent-client/src/validate-real.test.ts @@ -18,9 +18,9 @@ describe("safeFacilitatorUrl", () => { it("strips auth credentials from URL", async () => { const { safeFacilitatorUrl } = await import("./validate-real.js"); - expect( - safeFacilitatorUrl("https://user:password@channels.openzeppelin.com/x402/testnet") - ).toBe("channels.openzeppelin.com"); + expect(safeFacilitatorUrl("https://user:password@channels.openzeppelin.com/x402/testnet")).toBe( + "channels.openzeppelin.com" + ); }); it("preserves port in host", async () => { diff --git a/apps/agent-client/src/validate-real.ts b/apps/agent-client/src/validate-real.ts index bcf0bcd..9054e58 100644 --- a/apps/agent-client/src/validate-real.ts +++ b/apps/agent-client/src/validate-real.ts @@ -86,17 +86,25 @@ async function main() { console.log("\n--- Facilitator Health ---"); if (!config.X402_FACILITATOR_URL) { console.log(`Host: not configured`); - console.log(`Warning: X402_FACILITATOR_URL is not set. Set it in your .env file for real payment validation.`); + console.log( + `Warning: X402_FACILITATOR_URL is not set. Set it in your .env file for real payment validation.` + ); console.log(`Probe attempted: no`); console.log(`Network: ${network}`); console.log(`Timestamp: ${probeTimestamp}`); - throw new Error("X402_FACILITATOR_URL is not configured. Real payment validation requires a facilitator URL."); + throw new Error( + "X402_FACILITATOR_URL is not configured. Real payment validation requires a facilitator URL." + ); } else { console.log(`Host: ${facilitatorHost ?? "unparseable"}`); console.log(`Network: ${network}`); console.log("[probe] Checking facilitator /supported..."); const healthResult = await checkFacilitator(config.X402_FACILITATOR_URL); - const reasonText = healthResult.ok ? undefined : typeof healthResult.body === "string" ? healthResult.body : JSON.stringify(healthResult.body); + const reasonText = healthResult.ok + ? undefined + : typeof healthResult.body === "string" + ? healthResult.body + : JSON.stringify(healthResult.body); console.log(`Probe attempted: yes`); console.log(`Status: ${healthResult.status === 0 ? "N/A" : healthResult.status}`); if (!healthResult.ok && reasonText) { @@ -105,9 +113,7 @@ async function main() { console.log(`Timestamp: ${probeTimestamp}`); if (!healthResult.ok) { - throw new Error( - `Facilitator check failed (${healthResult.status}): ${reasonText}` - ); + throw new Error(`Facilitator check failed (${healthResult.status}): ${reasonText}`); } console.log("[ok] Facilitator reachable and returned /supported response."); } diff --git a/apps/api/src/lib/storage/serialization.ts b/apps/api/src/lib/storage/serialization.ts index 1e25bd1..a4fb243 100644 --- a/apps/api/src/lib/storage/serialization.ts +++ b/apps/api/src/lib/storage/serialization.ts @@ -217,9 +217,7 @@ export function rowToUsageEvent(row: Record): UsageEvent { : undefined, sponsorPublicKey: row.sponsor_public_key ? String(row.sponsor_public_key) : undefined, priceOutlier: priceOutlier || undefined, - priceOutlierReason: row.price_outlier_reason - ? String(row.price_outlier_reason) - : undefined + priceOutlierReason: row.price_outlier_reason ? String(row.price_outlier_reason) : undefined }; } From 0b8f6240834d360055552ccb3f35a33499b6a10c Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 16:49:57 +0100 Subject: [PATCH 16/19] fix: format code to pass Prettier formatting checks --- apps/agent-client/package.json | 2 +- apps/agent-client/src/cli.ts | 50 ++++++++++++++------- apps/agent-client/src/transcript.ts | 68 +++++++++++++++++------------ 3 files changed, 75 insertions(+), 45 deletions(-) diff --git a/apps/agent-client/package.json b/apps/agent-client/package.json index 524c427..3e549a8 100644 --- a/apps/agent-client/package.json +++ b/apps/agent-client/package.json @@ -33,4 +33,4 @@ "typescript": "^5.8.3", "vitest": "^3.2.4" } -} \ No newline at end of file +} diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 0d91d85..7367487 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -17,13 +17,13 @@ export interface SummaryInput { /** Formats the post-query summary table. Pure function — safe to unit-test directly. */ export function formatSummary(input: SummaryInput): string { const rows: [string, string][] = [ - ["Mode", input.mode], - ["Provider", input.provider], - ["Status", String(input.status)], - ["Client", input.isDemoMode ? "demo" : "real"], + ["Mode", input.mode], + ["Provider", input.provider], + ["Status", String(input.status)], + ["Client", input.isDemoMode ? "demo" : "real"], ["Price (USD)", input.priceUsd != null ? String(input.priceUsd) : "n/a"], - ["Asset", input.asset ?? "n/a"], - ["Trace ID", input.traceId ?? "unavailable"], + ["Asset", input.asset ?? "n/a"], + ["Trace ID", input.traceId ?? "unavailable"], ["Evidence ID", input.evidenceId ?? "unavailable"], ]; if (input.latencyMs != null) { @@ -39,8 +39,12 @@ export function formatSummary(input: SummaryInput): string { function usage() { console.log("Usage:"); - console.log(' npm run cli -- search "latest soroban updates" --provider search.basic'); - console.log(' npm run cli -- news "stablecoin micropayments" --provider news.fast'); + console.log( + ' npm run cli -- search "latest soroban updates" --provider search.basic' + ); + console.log( + ' npm run cli -- news "stablecoin micropayments" --provider news.fast' + ); console.log(' npm run cli -- scrape "https://example.com" --provider scrape.page'); } @@ -76,20 +80,29 @@ async function main() { const provider = readArg("--provider", args) ?? - (mode === "search" ? "search.basic" : mode === "news" ? "news.fast" : "scrape.page"); + (mode === "search" + ? "search.basic" + : mode === "news" + ? "news.fast" + : "scrape.page"); const start = Date.now(); const result = await runPaidQuery({ mode, provider, query: mode === "scrape" ? undefined : term, - url: mode === "scrape" ? term : undefined + url: mode === "scrape" ? term : undefined, }); const latencyMs = Date.now() - start; const payload = result.body as Record; - const resultBlock = (payload?.result ?? (payload?.body as Record)?.result) as Record | undefined; - const evidenceBlock = (payload?.payment as Record)?.evidence as Record | undefined; + const resultBlock = ( + payload?.result ?? + (payload?.body as Record)?.result + ) as Record | undefined; + const evidenceBlock = ( + payload?.payment as Record + )?.evidence as Record | undefined; console.log( formatSummary({ @@ -98,9 +111,13 @@ async function main() { isDemoMode: result.isDemoMode, status: result.status, priceUsd: resultBlock?.priceUsd as string | number | undefined, - asset: (evidenceBlock?.proofLinks as Record | undefined)?.asset, + asset: ( + evidenceBlock?.proofLinks as Record | undefined + )?.asset, traceId: resultBlock?.traceId as string | undefined, - evidenceId: (evidenceBlock?.id ?? evidenceBlock?.evidenceId) as string | undefined, + evidenceId: ( + evidenceBlock?.id ?? evidenceBlock?.evidenceId + ) as string | undefined, latencyMs, }) ); @@ -110,7 +127,10 @@ import { fileURLToPath } from "node:url"; if (process.argv[1] === fileURLToPath(import.meta.url)) { main().catch((error) => { - console.error("CLI request failed:", error instanceof Error ? error.message : error); + console.error( + "CLI request failed:", + error instanceof Error ? error.message : error + ); process.exit(1); }); } diff --git a/apps/agent-client/src/transcript.ts b/apps/agent-client/src/transcript.ts index 9163d79..2c0bb9e 100644 --- a/apps/agent-client/src/transcript.ts +++ b/apps/agent-client/src/transcript.ts @@ -49,9 +49,9 @@ const API_BASE = config.API_BASE_URL.replace(/\/$/, ""); // Secret redaction // --------------------------------------------------------------------------- const SECRET_PATTERNS: RegExp[] = [ - /S[A-Z0-9]{55}/g, // Stellar secret key (starts with S, 56 chars) - /Bearer\s+\S+/gi, // Bearer tokens - /x-payment:\s*\S+/gi, // raw payment header value + /S[A-Z0-9]{55}/g, // Stellar secret key (starts with S, 56 chars) + /Bearer\s+\S+/gi, // Bearer tokens + /x-payment:\s*\S+/gi, // raw payment header value /X402-Payment:\s*\S+/gi, ]; const REDACTED = "[REDACTED]"; @@ -61,7 +61,7 @@ const SENSITIVE_HEADER_KEYS = new Set([ "x402-payment", "authorization", "x-api-key", - "payment-response", // raw tx ID; replaced with presence flag below + "payment-response", // raw tx ID; replaced with presence flag below ]); const SENSITIVE_OBJ_KEYS = new Set([ @@ -117,15 +117,21 @@ interface RawResult { function httpGet(url: string): Promise { return new Promise((resolve, reject) => { - http.get(url, (res) => { - let raw = ""; - res.on("data", (chunk: Buffer) => (raw += chunk.toString())); - res.on("end", () => { - let body: unknown; - try { body = JSON.parse(raw); } catch { body = raw; } - resolve({ status: res.statusCode ?? 0, headers: res.headers, body }); - }); - }).on("error", reject); + http + .get(url, (res) => { + let raw = ""; + res.on("data", (chunk: Buffer) => (raw += chunk.toString())); + res.on("end", () => { + let body: unknown; + try { + body = JSON.parse(raw); + } catch { + body = raw; + } + resolve({ status: res.statusCode ?? 0, headers: res.headers, body }); + }); + }) + .on("error", reject); }); } @@ -210,9 +216,13 @@ async function step2Catalog(): Promise { */ async function step3PaidQueries(): Promise { const queries: Array[0]> = [ - { mode: "search", provider: "search.pro", query: "latest stellar x402 updates" }, - { mode: "news", provider: "news.deep", query: "stablecoin micropayments" }, - { mode: "scrape", provider: "scrape.extract", url: "https://developers.stellar.org" }, + { mode: "search", provider: "search.pro", query: "latest stellar x402 updates" }, + { mode: "news", provider: "news.deep", query: "stablecoin micropayments" }, + { + mode: "scrape", + provider: "scrape.extract", + url: "https://developers.stellar.org", + }, ]; const steps: Step[] = []; @@ -225,20 +235,20 @@ async function step3PaidQueries(): Promise { try { const response = await runPaidQuery(q); const payload = response.body as Record | undefined; - const result = payload?.result as Record | undefined; + const result = payload?.result as Record | undefined; steps.push({ step: label, timestamp, status: response.status, body: redact({ - provider: q.provider, - endpoint: response.endpoint, + provider: q.provider, + endpoint: response.endpoint, // Never write the raw payment-response header value; record presence only payment_response_present: Boolean(response.paymentResponse), - price_usd: result?.priceUsd ?? "n/a", - items_returned: Array.isArray(result?.items) ? result.items.length : 0, - result_body: payload, + price_usd: result?.priceUsd ?? "n/a", + items_returned: Array.isArray(result?.items) ? result.items.length : 0, + result_body: payload, }), note: "DEMO_MODE=true — payment header contains a placeholder tx ID; " + @@ -254,16 +264,16 @@ async function step3PaidQueries(): Promise { function step4Metadata(paidSteps: Step[]): Step { const first = paidSteps.find((s) => s.status !== "n/a"); - const body = first?.body as Record | undefined; + const body = first?.body as Record | undefined; return { step: "4_response_metadata", timestamp: new Date().toISOString(), status: "n/a", body: { - provider: body?.provider ?? "search.pro", - price_usd: body?.price_usd ?? "n/a", + provider: body?.provider ?? "search.pro", + price_usd: body?.price_usd ?? "n/a", settlement_network: "stellar:testnet", - payment_status: "DEMO — no real Stellar settlement", + payment_status: "DEMO — no real Stellar settlement", note: "In production this section contains the facilitator-signed " + "payment-response header. Here it is intentionally omitted.", @@ -329,7 +339,7 @@ function toText(t: Transcript): string { lines.push(`▶ ${s.step}`); lines.push(` Timestamp : ${s.timestamp}`); lines.push(` Status : ${s.status}`); - if (s.note) lines.push(` Note : ${s.note}`); + if (s.note) lines.push(` Note : ${s.note}`); if (s.error) lines.push(` ERROR : ${s.error}`); if (s.body) { lines.push(" Body:"); @@ -348,10 +358,10 @@ function writeArtifact(t: Transcript): { json: string; txt: string } { const slug = t.generated_at.replace(/[:.]/g, "-").replace("T", "_"); const jsonPath = path.join(OUT_DIR, `demo-transcript-${slug}.json`); - const txtPath = path.join(OUT_DIR, `demo-transcript-${slug}.txt`); + const txtPath = path.join(OUT_DIR, `demo-transcript-${slug}.txt`); fs.writeFileSync(jsonPath, JSON.stringify(t, null, 2), "utf8"); - fs.writeFileSync(txtPath, toText(t), "utf8"); + fs.writeFileSync(txtPath, toText(t), "utf8"); return { json: jsonPath, txt: txtPath }; } From da3d738b8f299856d345af672218981e92d638af Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 16:53:50 +0100 Subject: [PATCH 17/19] fix: format code per Prettier config (printWidth: 100, trailingComma: none) --- apps/agent-client/src/cli.test.ts | 48 ++++++++++++++---------- apps/agent-client/src/cli.ts | 20 ++++++---- apps/agent-client/src/transcript.ts | 57 ++++++++++++++++------------- 3 files changed, 72 insertions(+), 53 deletions(-) diff --git a/apps/agent-client/src/cli.test.ts b/apps/agent-client/src/cli.test.ts index 82e4197..4585ffe 100644 --- a/apps/agent-client/src/cli.test.ts +++ b/apps/agent-client/src/cli.test.ts @@ -21,27 +21,35 @@ describe("CLI Validation", () => { } }); - it("exits with clear message when URL is missing for scrape mode (with flag)", async () => { - try { - await execAsync(`${tsx} "${cliPath}" scrape --provider scrape.page`); - expect.fail("Should have failed"); - } catch (error: any) { - expect(error.code).toBe(1); - expect(error.stderr).toContain("Missing URL for scrape mode."); - expect(error.stdout).toContain("Usage:"); + it( + "exits with clear message when URL is missing for scrape mode (with flag)", + async () => { + try { + await execAsync( + `${tsx} "${cliPath}" scrape --provider scrape.page` + ); + expect.fail("Should have failed"); + } catch (error: any) { + expect(error.code).toBe(1); + expect(error.stderr).toContain("Missing URL for scrape mode."); + expect(error.stdout).toContain("Usage:"); + } } - }); - - it("exits with clear message when query is missing for news mode", async () => { - try { - await execAsync(`${tsx} "${cliPath}" news`); - expect.fail("Should have failed"); - } catch (error: any) { - expect(error.code).toBe(1); - expect(error.stderr).toContain("Missing query for news mode."); - expect(error.stdout).toContain("Usage:"); + ); + + it( + "exits with clear message when query is missing for news mode", + async () => { + try { + await execAsync(`${tsx} "${cliPath}" news`); + expect.fail("Should have failed"); + } catch (error: any) { + expect(error.code).toBe(1); + expect(error.stderr).toContain("Missing query for news mode."); + expect(error.stdout).toContain("Usage:"); + } } - }); + ); }); describe("formatSummary", () => { @@ -54,7 +62,7 @@ describe("formatSummary", () => { asset: "USDC", traceId: "trace-abc-123", evidenceId: "ev-xyz-789", - latencyMs: 342, + latencyMs: 342 }; it("includes mode and provider", () => { diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 7367487..93423a0 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -21,10 +21,13 @@ export function formatSummary(input: SummaryInput): string { ["Provider", input.provider], ["Status", String(input.status)], ["Client", input.isDemoMode ? "demo" : "real"], - ["Price (USD)", input.priceUsd != null ? String(input.priceUsd) : "n/a"], + [ + "Price (USD)", + input.priceUsd != null ? String(input.priceUsd) : "n/a" + ], ["Asset", input.asset ?? "n/a"], ["Trace ID", input.traceId ?? "unavailable"], - ["Evidence ID", input.evidenceId ?? "unavailable"], + ["Evidence ID", input.evidenceId ?? "unavailable"] ]; if (input.latencyMs != null) { rows.push(["Latency", `${input.latencyMs}ms`]); @@ -45,7 +48,9 @@ function usage() { console.log( ' npm run cli -- news "stablecoin micropayments" --provider news.fast' ); - console.log(' npm run cli -- scrape "https://example.com" --provider scrape.page'); + console.log( + ' npm run cli -- scrape "https://example.com" --provider scrape.page' + ); } function readArg(flag: string, args: string[]) { @@ -91,7 +96,7 @@ async function main() { mode, provider, query: mode === "scrape" ? undefined : term, - url: mode === "scrape" ? term : undefined, + url: mode === "scrape" ? term : undefined }); const latencyMs = Date.now() - start; @@ -111,14 +116,13 @@ async function main() { isDemoMode: result.isDemoMode, status: result.status, priceUsd: resultBlock?.priceUsd as string | number | undefined, - asset: ( - evidenceBlock?.proofLinks as Record | undefined - )?.asset, + asset: (evidenceBlock?.proofLinks as Record | undefined) + ?.asset, traceId: resultBlock?.traceId as string | undefined, evidenceId: ( evidenceBlock?.id ?? evidenceBlock?.evidenceId ) as string | undefined, - latencyMs, + latencyMs }) ); } diff --git a/apps/agent-client/src/transcript.ts b/apps/agent-client/src/transcript.ts index 2c0bb9e..8ff2a89 100644 --- a/apps/agent-client/src/transcript.ts +++ b/apps/agent-client/src/transcript.ts @@ -49,10 +49,10 @@ const API_BASE = config.API_BASE_URL.replace(/\/$/, ""); // Secret redaction // --------------------------------------------------------------------------- const SECRET_PATTERNS: RegExp[] = [ - /S[A-Z0-9]{55}/g, // Stellar secret key (starts with S, 56 chars) - /Bearer\s+\S+/gi, // Bearer tokens - /x-payment:\s*\S+/gi, // raw payment header value - /X402-Payment:\s*\S+/gi, + /S[A-Z0-9]{55}/g, + /Bearer\s+\S+/gi, + /x-payment:\s*\S+/gi, + /X402-Payment:\s*\S+/gi ]; const REDACTED = "[REDACTED]"; @@ -61,7 +61,7 @@ const SENSITIVE_HEADER_KEYS = new Set([ "x402-payment", "authorization", "x-api-key", - "payment-response", // raw tx ID; replaced with presence flag below + "payment-response" ]); const SENSITIVE_OBJ_KEYS = new Set([ @@ -71,7 +71,7 @@ const SENSITIVE_OBJ_KEYS = new Set([ "private_key", "privatekey", "api_key", - "apikey", + "apikey" ]); function redact(value: unknown): unknown { @@ -175,7 +175,7 @@ async function step1Health(): Promise { note: r.status === 200 ? "API is healthy and ready." - : "API responded but may not be fully ready.", + : "API responded but may not be fully ready." }; } catch (err) { return { @@ -183,7 +183,7 @@ async function step1Health(): Promise { timestamp, status: "n/a", error: `Could not reach ${API_BASE}/health — is the API running? (${err})`, - note: "Transcript is still written for CI evidence purposes.", + note: "Transcript is still written for CI evidence purposes." }; } } @@ -198,14 +198,14 @@ async function step2Catalog(): Promise { status: r.status, responseHeaders: safeHeaders(r.headers), body: redact(r.body), - note: "Available search/news/scrape providers with per-request pricing.", + note: "Available search/news/scrape providers with per-request pricing." }; } catch (err) { return { step: "2_provider_catalog", timestamp, status: "n/a", - error: String(err), + error: String(err) }; } } @@ -216,13 +216,17 @@ async function step2Catalog(): Promise { */ async function step3PaidQueries(): Promise { const queries: Array[0]> = [ - { mode: "search", provider: "search.pro", query: "latest stellar x402 updates" }, + { + mode: "search", + provider: "search.pro", + query: "latest stellar x402 updates" + }, { mode: "news", provider: "news.deep", query: "stablecoin micropayments" }, { mode: "scrape", provider: "scrape.extract", - url: "https://developers.stellar.org", - }, + url: "https://developers.stellar.org" + } ]; const steps: Step[] = []; @@ -230,7 +234,7 @@ async function step3PaidQueries(): Promise { for (let i = 0; i < queries.length; i++) { const q = queries[i]; const timestamp = new Date().toISOString(); - const label = `3${String.fromCharCode(97 + i)}_demo_paid_${q.mode}`; // 3a_, 3b_, 3c_ + const label = `3${String.fromCharCode(97 + i)}_demo_paid_${q.mode}`; try { const response = await runPaidQuery(q); @@ -244,15 +248,16 @@ async function step3PaidQueries(): Promise { body: redact({ provider: q.provider, endpoint: response.endpoint, - // Never write the raw payment-response header value; record presence only payment_response_present: Boolean(response.paymentResponse), price_usd: result?.priceUsd ?? "n/a", - items_returned: Array.isArray(result?.items) ? result.items.length : 0, - result_body: payload, + items_returned: Array.isArray(result?.items) + ? result.items.length + : 0, + result_body: payload }), note: "DEMO_MODE=true — payment header contains a placeholder tx ID; " + - "no real Stellar transaction is submitted or settled.", + "no real Stellar transaction is submitted or settled." }); } catch (err) { steps.push({ step: label, timestamp, status: "n/a", error: String(err) }); @@ -276,9 +281,9 @@ function step4Metadata(paidSteps: Step[]): Step { payment_status: "DEMO — no real Stellar settlement", note: "In production this section contains the facilitator-signed " + - "payment-response header. Here it is intentionally omitted.", + "payment-response header. Here it is intentionally omitted." }, - note: "Synthesised from paid-query responses. No secrets included.", + note: "Synthesised from paid-query responses. No secrets included." }; } @@ -292,14 +297,14 @@ async function step5Analytics(): Promise { status: r.status, responseHeaders: safeHeaders(r.headers), body: redact(r.body), - note: "Total spend + per-category breakdown stored in SQLite.", + note: "Total spend + per-category breakdown stored in SQLite." }; } catch (err) { return { step: "5_analytics_summary", timestamp, status: "n/a", - error: String(err), + error: String(err) }; } } @@ -318,7 +323,7 @@ function assemble(steps: Step[]): Transcript { "Generated in DEMO_MODE. No real Stellar credentials or live payments " + "were used. All secret fields are redacted. " + "Safe to attach to Drips/SCF updates and investor notes.", - steps, + steps }; } @@ -333,7 +338,7 @@ function toText(t: Transcript): string { ` Network : ${t.settlement_network}`, ` ⚠ ${t.warning}`, bar, - "", + "" ]; for (const s of t.steps) { lines.push(`▶ ${s.step}`); @@ -399,7 +404,9 @@ async function main(): Promise { console.log(` JSON : ${json}`); console.log(` TXT : ${txt}`); console.log(""); - console.log(" Label : DEMO_MODE (safe for SCF / Drips / investor notes)"); + console.log( + " Label : DEMO_MODE (safe for SCF / Drips / investor notes)" + ); console.log(" Secrets : all redacted"); console.log(" Payment : no real Stellar transaction"); } From ecfa565edf2a6ac9882012601d4e61177554d295 Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 16:59:24 +0100 Subject: [PATCH 18/19] fix: correct Prettier formatting for multi-line constructs and line breaks --- apps/agent-client/src/cli.ts | 5 +++-- apps/agent-client/src/transcript.ts | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 93423a0..40ed36f 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -116,8 +116,9 @@ async function main() { isDemoMode: result.isDemoMode, status: result.status, priceUsd: resultBlock?.priceUsd as string | number | undefined, - asset: (evidenceBlock?.proofLinks as Record | undefined) - ?.asset, + asset: ( + evidenceBlock?.proofLinks as Record | undefined + )?.asset, traceId: resultBlock?.traceId as string | undefined, evidenceId: ( evidenceBlock?.id ?? evidenceBlock?.evidenceId diff --git a/apps/agent-client/src/transcript.ts b/apps/agent-client/src/transcript.ts index 8ff2a89..06f6b63 100644 --- a/apps/agent-client/src/transcript.ts +++ b/apps/agent-client/src/transcript.ts @@ -404,9 +404,9 @@ async function main(): Promise { console.log(` JSON : ${json}`); console.log(` TXT : ${txt}`); console.log(""); - console.log( - " Label : DEMO_MODE (safe for SCF / Drips / investor notes)" - ); + const note = + " Label : DEMO_MODE (safe for SCF / Drips / investor notes)"; + console.log(note); console.log(" Secrets : all redacted"); console.log(" Payment : no real Stellar transaction"); } From 819e909171f325ea00fdf2451216626580fdf47c Mon Sep 17 00:00:00 2001 From: Micheal-Blessed Date: Wed, 1 Jul 2026 16:06:31 +0000 Subject: [PATCH 19/19] fix: apply Prettier auto-formatting --- apps/agent-client/src/cli.test.ts | 46 +++++++++++--------------- apps/agent-client/src/cli.ts | 51 ++++++++--------------------- apps/agent-client/src/transcript.ts | 15 +++------ 3 files changed, 36 insertions(+), 76 deletions(-) diff --git a/apps/agent-client/src/cli.test.ts b/apps/agent-client/src/cli.test.ts index 4585ffe..c4a9be7 100644 --- a/apps/agent-client/src/cli.test.ts +++ b/apps/agent-client/src/cli.test.ts @@ -21,35 +21,27 @@ describe("CLI Validation", () => { } }); - it( - "exits with clear message when URL is missing for scrape mode (with flag)", - async () => { - try { - await execAsync( - `${tsx} "${cliPath}" scrape --provider scrape.page` - ); - expect.fail("Should have failed"); - } catch (error: any) { - expect(error.code).toBe(1); - expect(error.stderr).toContain("Missing URL for scrape mode."); - expect(error.stdout).toContain("Usage:"); - } + it("exits with clear message when URL is missing for scrape mode (with flag)", async () => { + try { + await execAsync(`${tsx} "${cliPath}" scrape --provider scrape.page`); + expect.fail("Should have failed"); + } catch (error: any) { + expect(error.code).toBe(1); + expect(error.stderr).toContain("Missing URL for scrape mode."); + expect(error.stdout).toContain("Usage:"); } - ); - - it( - "exits with clear message when query is missing for news mode", - async () => { - try { - await execAsync(`${tsx} "${cliPath}" news`); - expect.fail("Should have failed"); - } catch (error: any) { - expect(error.code).toBe(1); - expect(error.stderr).toContain("Missing query for news mode."); - expect(error.stdout).toContain("Usage:"); - } + }); + + it("exits with clear message when query is missing for news mode", async () => { + try { + await execAsync(`${tsx} "${cliPath}" news`); + expect.fail("Should have failed"); + } catch (error: any) { + expect(error.code).toBe(1); + expect(error.stderr).toContain("Missing query for news mode."); + expect(error.stdout).toContain("Usage:"); } - ); + }); }); describe("formatSummary", () => { diff --git a/apps/agent-client/src/cli.ts b/apps/agent-client/src/cli.ts index 40ed36f..a6a3518 100644 --- a/apps/agent-client/src/cli.ts +++ b/apps/agent-client/src/cli.ts @@ -21,10 +21,7 @@ export function formatSummary(input: SummaryInput): string { ["Provider", input.provider], ["Status", String(input.status)], ["Client", input.isDemoMode ? "demo" : "real"], - [ - "Price (USD)", - input.priceUsd != null ? String(input.priceUsd) : "n/a" - ], + ["Price (USD)", input.priceUsd != null ? String(input.priceUsd) : "n/a"], ["Asset", input.asset ?? "n/a"], ["Trace ID", input.traceId ?? "unavailable"], ["Evidence ID", input.evidenceId ?? "unavailable"] @@ -33,24 +30,16 @@ export function formatSummary(input: SummaryInput): string { rows.push(["Latency", `${input.latencyMs}ms`]); } const labelWidth = Math.max(...rows.map(([label]) => label.length)); - const body = rows - .map(([label, value]) => ` ${label.padEnd(labelWidth)} ${value}`) - .join("\n"); + const body = rows.map(([label, value]) => ` ${label.padEnd(labelWidth)} ${value}`).join("\n"); const divider = "=".repeat(labelWidth + 4 + 20); return `\n=== Query402 Paid Query Summary ===\n${body}\n${divider}`; } function usage() { console.log("Usage:"); - console.log( - ' npm run cli -- search "latest soroban updates" --provider search.basic' - ); - console.log( - ' npm run cli -- news "stablecoin micropayments" --provider news.fast' - ); - console.log( - ' npm run cli -- scrape "https://example.com" --provider scrape.page' - ); + console.log(' npm run cli -- search "latest soroban updates" --provider search.basic'); + console.log(' npm run cli -- news "stablecoin micropayments" --provider news.fast'); + console.log(' npm run cli -- scrape "https://example.com" --provider scrape.page'); } function readArg(flag: string, args: string[]) { @@ -85,11 +74,7 @@ async function main() { const provider = readArg("--provider", args) ?? - (mode === "search" - ? "search.basic" - : mode === "news" - ? "news.fast" - : "scrape.page"); + (mode === "search" ? "search.basic" : mode === "news" ? "news.fast" : "scrape.page"); const start = Date.now(); const result = await runPaidQuery({ @@ -101,13 +86,10 @@ async function main() { const latencyMs = Date.now() - start; const payload = result.body as Record; - const resultBlock = ( - payload?.result ?? - (payload?.body as Record)?.result - ) as Record | undefined; - const evidenceBlock = ( - payload?.payment as Record - )?.evidence as Record | undefined; + const resultBlock = (payload?.result ?? (payload?.body as Record)?.result) as + Record | undefined; + const evidenceBlock = (payload?.payment as Record)?.evidence as + Record | undefined; console.log( formatSummary({ @@ -116,13 +98,9 @@ async function main() { isDemoMode: result.isDemoMode, status: result.status, priceUsd: resultBlock?.priceUsd as string | number | undefined, - asset: ( - evidenceBlock?.proofLinks as Record | undefined - )?.asset, + asset: (evidenceBlock?.proofLinks as Record | undefined)?.asset, traceId: resultBlock?.traceId as string | undefined, - evidenceId: ( - evidenceBlock?.id ?? evidenceBlock?.evidenceId - ) as string | undefined, + evidenceId: (evidenceBlock?.id ?? evidenceBlock?.evidenceId) as string | undefined, latencyMs }) ); @@ -132,10 +110,7 @@ import { fileURLToPath } from "node:url"; if (process.argv[1] === fileURLToPath(import.meta.url)) { main().catch((error) => { - console.error( - "CLI request failed:", - error instanceof Error ? error.message : error - ); + console.error("CLI request failed:", error instanceof Error ? error.message : error); process.exit(1); }); } diff --git a/apps/agent-client/src/transcript.ts b/apps/agent-client/src/transcript.ts index 06f6b63..39e2736 100644 --- a/apps/agent-client/src/transcript.ts +++ b/apps/agent-client/src/transcript.ts @@ -37,9 +37,7 @@ const OUT_DIR = path.resolve(__dirname, "../../../transcript"); // Guard: refuse to run outside DEMO_MODE // --------------------------------------------------------------------------- if (config.DEMO_MODE !== "true") { - console.error( - "ERROR: Set DEMO_MODE=true to generate a transcript without live credentials." - ); + console.error("ERROR: Set DEMO_MODE=true to generate a transcript without live credentials."); process.exit(1); } @@ -173,9 +171,7 @@ async function step1Health(): Promise { responseHeaders: safeHeaders(r.headers), body: redact(r.body), note: - r.status === 200 - ? "API is healthy and ready." - : "API responded but may not be fully ready." + r.status === 200 ? "API is healthy and ready." : "API responded but may not be fully ready." }; } catch (err) { return { @@ -250,9 +246,7 @@ async function step3PaidQueries(): Promise { endpoint: response.endpoint, payment_response_present: Boolean(response.paymentResponse), price_usd: result?.priceUsd ?? "n/a", - items_returned: Array.isArray(result?.items) - ? result.items.length - : 0, + items_returned: Array.isArray(result?.items) ? result.items.length : 0, result_body: payload }), note: @@ -404,8 +398,7 @@ async function main(): Promise { console.log(` JSON : ${json}`); console.log(` TXT : ${txt}`); console.log(""); - const note = - " Label : DEMO_MODE (safe for SCF / Drips / investor notes)"; + const note = " Label : DEMO_MODE (safe for SCF / Drips / investor notes)"; console.log(note); console.log(" Secrets : all redacted"); console.log(" Payment : no real Stellar transaction");