diff --git a/AGENTS.md b/AGENTS.md index 77a9410..8a17ef3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,10 +12,15 @@ ## Project Architecture - **src/index.ts** - Main entry point, exports createDecartClient with realtime and process clients -- **src/process/** - HTTP API for asynchronous video/image generation +- **src/process/** - HTTP API for synchronous image generation - `client.ts` - Process client implementation for model inference - `request.ts` - HTTP request handling and file input processing - `types.ts` - TypeScript types for process API options +- **src/queue/** - Queue-based async job processing for video generation + - `client.ts` - Queue client for submit, status check, and polling + - `polling.ts` - Polling logic until job completion + - `request.ts` - HTTP request handling for queue API + - `types.ts` - TypeScript types for queue operations - **src/realtime/** - WebRTC real-time video streaming logic - `client.ts` - Real-time client implementation with WebRTC connection management - `webrtc-manager.ts` - WebRTC connection lifecycle and signaling @@ -24,9 +29,12 @@ - `types.ts` - TypeScript types for WebRTC messages and events - **src/shared/** - Shared model definitions and types - `model.ts` - Model registry with definitions for realtime, video, and image models + - `request.ts` - Shared HTTP request utilities and file input processing - `types.ts` - Common types across APIs (ModelState, etc.) - **src/utils/** - Shared utilities + - `env.ts` - Environment variable handling - `errors.ts` - Error factory pattern with ERROR_CODES constants + - `user-agent.ts` - User-agent string generation for HTTP requests - **tests/** - Test files using Vitest (.test.ts extension) - **dist/** - Build output (gitignored, generated by tsdown) @@ -46,7 +54,7 @@ - Dev: tsdown (build), vitest (test), typescript, vite (examples), bumpp (releases) ## API Design Patterns -- **Factory Functions**: Use `create*` pattern for constructors (createDecartClient, createRealTimeClient, createProcessClient) +- **Factory Functions**: Use `create*` pattern for constructors (createDecartClient, createRealTimeClient, createProcessClient, createQueueClient) - **Options Validation**: Validate all public API options with Zod schemas - **Error Messages**: Provide clear, actionable error messages with specific error codes - **Type Exports**: Export all public types alongside implementations @@ -59,13 +67,14 @@ - `mirage_v2` - Real-time video restyling model (v2) - `lucy_v2v_720p_rt` - Real-time video editing model -### Video Models (Process API) +### Video Models (Queue API) - `lucy-dev-i2v` - image-to-video (Dev quality) - `lucy-fast-v2v` - video-to-video (Fast quality) - `lucy-pro-t2v` - text-to-video (Pro quality) - `lucy-pro-i2v` - image-to-video (Pro quality) - `lucy-pro-v2v` - video-to-video (Pro quality) - `lucy-pro-flf2v` - first-last-frame-to-video (Pro quality) +- `lucy-motion` - motion-based image-to-video (trajectory-guided animation) ### Image Models (Process API) - `lucy-pro-t2i` - text-to-image (Pro quality) diff --git a/TYPE_SAFETY.md b/TYPE_SAFETY.md deleted file mode 100644 index ea051dd..0000000 --- a/TYPE_SAFETY.md +++ /dev/null @@ -1,124 +0,0 @@ -# Type-Safe Process API - -The process API now provides **both compile-time type safety and runtime validation** through model-specific input schemas. - -## How It Works - -Each model declares its own input schema using Zod, and TypeScript automatically infers the correct types based on the model you select: - -```typescript -// ✅ Text-to-Video: only prompt required -await client.process({ - model: models.video("lucy-pro-t2v"), - prompt: "A cat walking", - seed: 42, // optional - orientation: "landscape", // optional -}); - -// ✅ Image-to-Video: requires prompt + data (file) -await client.process({ - model: models.video("lucy-pro-i2v"), - prompt: "Make it cinematic", - data: imageFile, - resolution: "720p", // optional -}); - -// ✅ First-Last-Frame: requires prompt + start + end -await client.process({ - model: models.video("lucy-pro-flf2v"), - prompt: "Smooth transition", - start: imageFile1, - end: imageFile2, -}); - -// ❌ TypeScript error: 'data' doesn't exist for t2v models -await client.process({ - model: models.video("lucy-pro-t2v"), - prompt: "A cat", - data: videoFile, // Type error! -}); -``` - -## Benefits - -### 1. Compile-Time Type Safety -TypeScript knows which fields are valid for each model through conditional type inference: - -```typescript -type ProcessOptions = { - model: T; - signal?: AbortSignal; -} & InferModelInputs; // Infers fields from model schema -``` - -### 2. Runtime Validation -Zod schemas catch invalid inputs with clear error messages: - -```typescript -// Missing required field -await client.process({ - model: models.video("lucy-pro-i2v"), - prompt: "test" - // Missing 'data' field -}); -// Error: Invalid inputs for lucy-pro-i2v: data is required -``` - -### 3. Single Source of Truth -Model schemas in `src/shared/model.ts` drive both types and validation: - -```typescript -export const modelInputSchemas = { - "lucy-pro-i2v": z.object({ - prompt: z.string(), - data: fileInputSchema, // Required - seed: z.number().optional(), - resolution: z.string().optional(), - }), - // ... more models -} as const; -``` - -### 4. Autocomplete -IDEs show correct fields for each model with inline documentation. - -## Architecture - -1. **Model Registry** (`src/shared/model.ts`): Each model includes `inputSchema` -2. **Conditional Types** (`src/process/types.ts`): `ProcessOptions` infers fields from model -3. **Runtime Validation** (`src/process/client.ts`): Validates using `model.inputSchema.safeParse()` -4. **Generic Model Helpers**: `models.video(model: T)` returns `ModelDefinition` for proper inference - -## Adding New Models - -```typescript -// 1. Add schema -export const modelInputSchemas = { - "new-model": z.object({ - prompt: z.string(), - customField: z.number(), - }), -} as const; - -// 2. Add to model union -export const videoModels = z.union([ - z.literal("new-model"), - // ... existing models -]); - -// 3. Add to registry -const _models = { - video: { - "new-model": { - name: "new-model" as const, - urlPath: "/v1/generate/new-model", - fps: 25, - width: 1280, - height: 704, - inputSchema: modelInputSchemas["new-model"], - }, - }, -}; -``` - -That's it! TypeScript and runtime validation automatically work. \ No newline at end of file diff --git a/examples/bun-cli/.env.example b/examples/bun-cli/.env.example new file mode 100644 index 0000000..cbdf351 --- /dev/null +++ b/examples/bun-cli/.env.example @@ -0,0 +1 @@ +DECART_API_KEY=your-api-key-here diff --git a/examples/bun-cli/.gitignore b/examples/bun-cli/.gitignore new file mode 100644 index 0000000..f8d20f6 --- /dev/null +++ b/examples/bun-cli/.gitignore @@ -0,0 +1,4 @@ +node_modules +.env +decart-cli +output.png diff --git a/examples/bun-cli/README.md b/examples/bun-cli/README.md new file mode 100644 index 0000000..bf23702 --- /dev/null +++ b/examples/bun-cli/README.md @@ -0,0 +1,39 @@ +# Bun CLI Example + +A simple CLI for text-to-image generation using the Decart SDK. + +## Setup + +1. Install dependencies: + ```bash + bun install + ``` + +2. Set your API key: + ```bash + export DECART_API_KEY=your-api-key-here + ``` + +3. Build: + ```bash + bun run build + ``` + +4. Link the executable: + ```bash + bun link + ``` + +## Usage + +### Dev-time +``` +./cli.ts text-to-image "A cyberpunk cityscape at night" +``` + +### Compiled +```bash +decart text-to-image "A cyberpunk cityscape at night" +``` + +The generated image will be saved to `output.png`. diff --git a/examples/bun-cli/cli.ts b/examples/bun-cli/cli.ts new file mode 100755 index 0000000..9ccf819 --- /dev/null +++ b/examples/bun-cli/cli.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env bun +import { createDecartClient, models } from "@decartai/sdk"; + +const [command, prompt] = process.argv.slice(2); + +if (command !== "text-to-image" || !prompt) { + console.error("Usage: decart text-to-image "); + process.exit(1); +} + +const client = createDecartClient(); + +console.log("Generating image..."); +const image = await client.process({ + model: models.image("lucy-pro-t2i"), + prompt, +}); + +await Bun.write("output.png", image); + +console.log("Image saved to output.png"); diff --git a/examples/bun-cli/package.json b/examples/bun-cli/package.json new file mode 100644 index 0000000..c8e143e --- /dev/null +++ b/examples/bun-cli/package.json @@ -0,0 +1,18 @@ +{ + "name": "@example/bun-cli", + "version": "0.0.0", + "private": true, + "type": "module", + "bin": { + "decart": "decart-cli" + }, + "scripts": { + "build": "bun build ./cli.ts --compile --outfile decart-cli" + }, + "dependencies": { + "@decartai/sdk": "workspace:*" + }, + "devDependencies": { + "@types/bun": "latest" + } +} diff --git a/examples/express-api/.env.example b/examples/express-api/.env.example new file mode 100644 index 0000000..9659843 --- /dev/null +++ b/examples/express-api/.env.example @@ -0,0 +1,2 @@ +DECART_API_KEY=your-api-key-here +PORT=3000 diff --git a/examples/express-api/.gitignore b/examples/express-api/.gitignore new file mode 100644 index 0000000..9c97bbd --- /dev/null +++ b/examples/express-api/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +.env diff --git a/examples/express-api/README.md b/examples/express-api/README.md new file mode 100644 index 0000000..567520a --- /dev/null +++ b/examples/express-api/README.md @@ -0,0 +1,78 @@ +# Express API Example + +An Express server demonstrating the Decart SDK's Process and Queue APIs. + +## Setup + +1. Copy `.env.example` to `.env` and add your API key: + +```sh +cp .env.example .env +``` + +2. Install dependencies from the repo root: + +```sh +cd ../.. +pnpm install +pnpm build +``` + +3. Start the development server: + +```sh +cd examples/express-api +pnpm dev +``` + +## Endpoints + +### Image Generation + +```bash +# Text-to-image +curl -X POST http://localhost:3000/api/image/generate \ + -H "Content-Type: application/json" \ + -d '{"prompt": "A beautiful sunset over mountains"}' \ + --output image.png + +# Image-to-image +curl -X POST http://localhost:3000/api/image/transform \ + -H "Content-Type: application/json" \ + -d '{"prompt": "Oil painting style", "imageUrl": "https://example.com/image.jpg"}' \ + --output transformed.png +``` + +### Video Generation + +```bash +# Submit video job +curl -X POST http://localhost:3000/api/video/generate \ + -H "Content-Type: application/json" \ + -d '{"prompt": "A cat playing piano"}' +# Returns: {"jobId": "abc123", "status": "pending"} + +# Check status +curl http://localhost:3000/api/video/status/abc123 +# Returns: {"job_id": "abc123", "status": "processing"} + +# Get result (when completed) +curl http://localhost:3000/api/video/result/abc123 --output video.mp4 + +# Or use the sync endpoint (waits for completion) +curl -X POST http://localhost:3000/api/video/generate-sync \ + -H "Content-Type: application/json" \ + -d '{"prompt": "A timelapse of clouds moving"}' \ + --output video.mp4 +``` + +## API Reference + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/api/image/generate` | POST | Generate image from text | +| `/api/image/transform` | POST | Transform image with prompt | +| `/api/video/generate` | POST | Submit video generation job | +| `/api/video/status/:id` | GET | Check video job status | +| `/api/video/result/:id` | GET | Get completed video | +| `/api/video/generate-sync` | POST | Generate video (waits for completion) | diff --git a/examples/express-api/package.json b/examples/express-api/package.json new file mode 100644 index 0000000..e1f8dae --- /dev/null +++ b/examples/express-api/package.json @@ -0,0 +1,21 @@ +{ + "name": "@example/express-api", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "tsx watch src/server.ts", + "start": "tsx src/server.ts" + }, + "dependencies": { + "@decartai/sdk": "workspace:*", + "dotenv": "^16.4.0", + "express": "^4.21.0" + }, + "devDependencies": { + "@types/express": "^4.17.0", + "@types/node": "^22.0.0", + "tsx": "^4.19.0", + "typescript": "^5.8.0" + } +} diff --git a/examples/express-api/src/server.ts b/examples/express-api/src/server.ts new file mode 100644 index 0000000..0260585 --- /dev/null +++ b/examples/express-api/src/server.ts @@ -0,0 +1,123 @@ +import "dotenv/config"; +import express from "express"; +import { createDecartClient, models } from "@decartai/sdk"; + +const app = express(); +app.use(express.json()); + +const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, +}); + +// Generate image from text (sync - returns immediately) +app.post("/api/image/generate", async (req, res) => { + try { + const { prompt } = req.body; + + const blob = await client.process({ + model: models.image("lucy-pro-t2i"), + prompt, + }); + + const buffer = Buffer.from(await blob.arrayBuffer()); + res.setHeader("Content-Type", "image/png"); + res.send(buffer); + } catch (error) { + res.status(500).json({ error: String(error) }); + } +}); + +// Transform image (sync - returns immediately) +app.post("/api/image/transform", async (req, res) => { + try { + const { prompt, imageUrl } = req.body; + + const blob = await client.process({ + model: models.image("lucy-pro-i2i"), + prompt, + data: imageUrl, + }); + + const buffer = Buffer.from(await blob.arrayBuffer()); + res.setHeader("Content-Type", "image/png"); + res.send(buffer); + } catch (error) { + res.status(500).json({ error: String(error) }); + } +}); + +// Submit video generation job (async - returns job ID) +app.post("/api/video/generate", async (req, res) => { + try { + const { prompt } = req.body; + + const job = await client.queue.submit({ + model: models.video("lucy-pro-t2v"), + prompt, + }); + + res.json({ jobId: job.job_id, status: job.status }); + } catch (error) { + res.status(500).json({ error: String(error) }); + } +}); + +// Check video job status +app.get("/api/video/status/:jobId", async (req, res) => { + try { + const status = await client.queue.status(req.params.jobId); + res.json(status); + } catch (error) { + res.status(500).json({ error: String(error) }); + } +}); + +// Get video result (when completed) +app.get("/api/video/result/:jobId", async (req, res) => { + try { + const blob = await client.queue.result(req.params.jobId); + const buffer = Buffer.from(await blob.arrayBuffer()); + res.setHeader("Content-Type", "video/mp4"); + res.send(buffer); + } catch (error) { + res.status(500).json({ error: String(error) }); + } +}); + +// Generate video with automatic polling (convenience endpoint) +app.post("/api/video/generate-sync", async (req, res) => { + try { + const { prompt, videoUrl } = req.body; + + const result = await client.queue.submitAndPoll({ + model: videoUrl + ? models.video("lucy-pro-v2v") + : models.video("lucy-pro-t2v"), + prompt, + ...(videoUrl && { data: videoUrl }), + }); + + if (result.status === "completed") { + const buffer = Buffer.from(await result.data.arrayBuffer()); + res.setHeader("Content-Type", "video/mp4"); + res.send(buffer); + } else { + res.status(500).json({ error: result.error }); + } + } catch (error) { + res.status(500).json({ error: String(error) }); + } +}); + +const port = process.env.PORT || 3000; +app.listen(port, () => { + console.log(`Server running at http://localhost:${port}`); + console.log(""); + console.log("Available endpoints:"); + console.log(" POST /api/image/generate - Generate image from text"); + console.log(" POST /api/image/transform - Transform image"); + console.log(" POST /api/video/generate - Submit video job"); + console.log(" GET /api/video/status/:id - Check job status"); + console.log(" GET /api/video/result/:id - Get video result"); + console.log(" POST /api/video/generate-sync - Generate video (wait for result)"); +}); diff --git a/examples/express-api/tsconfig.json b/examples/express-api/tsconfig.json new file mode 100644 index 0000000..1e50d1e --- /dev/null +++ b/examples/express-api/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist" + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/nextjs-realtime/.env.example b/examples/nextjs-realtime/.env.example new file mode 100644 index 0000000..4d3ffe8 --- /dev/null +++ b/examples/nextjs-realtime/.env.example @@ -0,0 +1 @@ +NEXT_PUBLIC_DECART_API_KEY=your-api-key-here diff --git a/examples/nextjs-realtime/.gitignore b/examples/nextjs-realtime/.gitignore new file mode 100644 index 0000000..bbdb244 --- /dev/null +++ b/examples/nextjs-realtime/.gitignore @@ -0,0 +1,30 @@ +# dependencies +node_modules +.pnpm-debug.log* + +# next.js +.next/ +out/ + +# production +build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/nextjs-realtime/README.md b/examples/nextjs-realtime/README.md new file mode 100644 index 0000000..a222691 --- /dev/null +++ b/examples/nextjs-realtime/README.md @@ -0,0 +1,47 @@ +# Next.js Realtime Example + +A Next.js application demonstrating real-time video transformation with the Decart SDK. + +## Setup + +1. Copy `.env.example` to `.env.local` and add your API key: + +```sh +cp .env.example .env.local +``` + +2. Install dependencies & build: + +```sh +pnpm install +pnpm build +``` + +3. Start the development server: + +```sh +pnpm dev +``` + +4. Open [http://localhost:3000](http://localhost:3000) in your browser. + +## Features + +- Real-time webcam video transformation +- Dynamic style prompt updates +- Connection state management +- Error handling + +## How it works + +1. The app captures your webcam feed using `getUserMedia` +2. The video stream is sent to Decart's realtime API +3. The transformed video is displayed side-by-side with the original +4. You can change the style prompt in real-time + +## Models + +This example uses `mirage_v2` for style transformation. You can also use: + +- `mirage` - MirageLSD video restyling model (older) +- `lucy_v2v_720p_rt` - Lucy for video editing (add objects, change elements) diff --git a/examples/nextjs-realtime/app/layout.tsx b/examples/nextjs-realtime/app/layout.tsx new file mode 100644 index 0000000..0f9b4bc --- /dev/null +++ b/examples/nextjs-realtime/app/layout.tsx @@ -0,0 +1,18 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Decart Realtime Demo", + description: "Real-time video transformation with Decart SDK", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/examples/nextjs-realtime/app/page.tsx b/examples/nextjs-realtime/app/page.tsx new file mode 100644 index 0000000..0459565 --- /dev/null +++ b/examples/nextjs-realtime/app/page.tsx @@ -0,0 +1,28 @@ +"use client"; + +import { useState } from "react"; +import { VideoStream } from "../components/video-stream"; + +export default function Home() { + const [prompt, setPrompt] = useState("anime style, vibrant colors"); + + return ( +
+

Decart Realtime Demo

+ +
+ +
+ + +
+ ); +} diff --git a/examples/nextjs-realtime/components/video-stream.tsx b/examples/nextjs-realtime/components/video-stream.tsx new file mode 100644 index 0000000..a9bd797 --- /dev/null +++ b/examples/nextjs-realtime/components/video-stream.tsx @@ -0,0 +1,111 @@ +"use client"; + +import { + createDecartClient, + type DecartSDKError, + models, + type RealTimeClient, +} from "@decartai/sdk"; +import { useEffect, useRef, useState } from "react"; + +interface VideoStreamProps { + prompt: string; +} + +export function VideoStream({ prompt }: VideoStreamProps) { + const inputRef = useRef(null); + const outputRef = useRef(null); + const realtimeClientRef = useRef(null); + const [status, setStatus] = useState("idle"); + + useEffect(() => { + let mounted = true; + + async function start() { + try { + const model = models.realtime("mirage_v2"); + + setStatus("requesting camera..."); + const stream = await navigator.mediaDevices.getUserMedia({ + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + if (!mounted) return; + + if (inputRef.current) { + inputRef.current.srcObject = stream; + } + + setStatus("connecting..."); + + const apiKey = process.env.NEXT_PUBLIC_DECART_API_KEY; + if (!apiKey) { + throw new Error("NEXT_PUBLIC_DECART_API_KEY is not set"); + } + + const client = createDecartClient({ + apiKey, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (transformedStream: MediaStream) => { + if (outputRef.current) { + outputRef.current.srcObject = transformedStream; + } + }, + initialState: { + prompt: { text: prompt, enhance: true }, + }, + }); + + realtimeClientRef.current = realtimeClient; + + // Subscribe to events + realtimeClient.on("connectionChange", (state) => { + setStatus(state); + }); + + realtimeClient.on("error", (error: DecartSDKError) => { + setStatus(`error: ${error.message}`); + }); + } catch (error) { + setStatus(`error: ${error}`); + } + } + + start(); + + return () => { + mounted = false; + realtimeClientRef.current?.disconnect(); + }; + }, []); + + // Update prompt when it changes + useEffect(() => { + if (realtimeClientRef.current?.isConnected()) { + realtimeClientRef.current.setPrompt(prompt, { enhance: true }); + } + }, [prompt]); + + return ( +
+

Status: {status}

+
+
+

Input

+
+
+

Styled Output

+
+
+
+ ); +} diff --git a/examples/nextjs-realtime/next.config.js b/examples/nextjs-realtime/next.config.js new file mode 100644 index 0000000..658404a --- /dev/null +++ b/examples/nextjs-realtime/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +module.exports = nextConfig; diff --git a/examples/nextjs-realtime/package.json b/examples/nextjs-realtime/package.json new file mode 100644 index 0000000..a2042a8 --- /dev/null +++ b/examples/nextjs-realtime/package.json @@ -0,0 +1,22 @@ +{ + "name": "@example/nextjs-realtime", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "@decartai/sdk": "workspace:*", + "next": "^15.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "typescript": "^5.8.0" + } +} diff --git a/examples/nextjs-realtime/tsconfig.json b/examples/nextjs-realtime/tsconfig.json new file mode 100644 index 0000000..d8b9323 --- /dev/null +++ b/examples/nextjs-realtime/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/examples/process.ts b/examples/process.ts deleted file mode 100644 index f05264e..0000000 --- a/examples/process.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Process API Examples - Image Models Only (Node.js) - * - * The process API supports synchronous image generation. - * For video models, use the queue API instead (see queue.ts). - * - * Note: API keys should be kept private and never exposed in browser code. - */ -import fs from "node:fs"; -import { createDecartClient, models } from "@decartai/sdk"; - -const client = createDecartClient({ - apiKey: process.env.DECART_API_KEY || "your-api-key", -}); - -async function main() { - // Text-to-Image generation - console.log("Generating image from text..."); - const textToImage = await client.process({ - model: models.image("lucy-pro-t2i"), - prompt: "A beautiful sunset over mountains", - orientation: "portrait", - }); - - // Save the generated image - const imageBuffer = Buffer.from(await textToImage.arrayBuffer()); - fs.writeFileSync("output_t2i.png", imageBuffer); - console.log("Image saved to output_t2i.png"); - - // Image-to-Image transformation - console.log("Transforming image..."); - const inputImage = fs.readFileSync("output_t2i.png"); - const imageToImage = await client.process({ - model: models.image("lucy-pro-i2i"), - prompt: "Oil painting style", - data: new Blob([inputImage]), - enhance_prompt: false, - }); - - // Save the transformed image - const transformedBuffer = Buffer.from(await imageToImage.arrayBuffer()); - fs.writeFileSync("output_i2i.png", transformedBuffer); - console.log("Image saved to output_i2i.png"); -} - -main().catch(console.error); diff --git a/examples/queue.ts b/examples/queue.ts deleted file mode 100644 index 53de084..0000000 --- a/examples/queue.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { createDecartClient, type FileInput, models } from "@decartai/sdk"; - -const fileInput = document.querySelector( - 'input[type="file"]', -) as HTMLInputElement; -const imageFile: FileInput = fileInput.files?.[0] as FileInput; - -const client = createDecartClient({ - apiKey: "your-api-key", -}); - -// Automatic polling - submits and waits for completion -const result = await client.queue.submitAndPoll({ - model: models.video("lucy-pro-i2v"), - prompt: "The image comes to life with gentle motion", - data: imageFile, - resolution: "720p", - onStatusChange: (job) => { - console.log(`Job ${job.job_id}: ${job.status}`); - }, -}); - -if (result.status === "completed") { - const videoElement = document.createElement("video"); - videoElement.src = URL.createObjectURL(result.data); - videoElement.play(); - document.body.appendChild(videoElement); -} else { - console.error("Job failed:", result.error); -} - -// Manual polling - submit and poll yourself -const job = await client.queue.submit({ - model: models.video("lucy-pro-t2v"), - prompt: "A cat playing piano", - resolution: "480p", -}); - -console.log(`Job submitted: ${job.job_id}`); - -let status = await client.queue.status(job.job_id); -while (status.status === "pending" || status.status === "processing") { - await new Promise((r) => setTimeout(r, 2000)); - status = await client.queue.status(job.job_id); -} - -if (status.status === "completed") { - const blob = await client.queue.result(job.job_id); - const videoElement = document.createElement("video"); - videoElement.src = URL.createObjectURL(blob); - videoElement.play(); - document.body.appendChild(videoElement); -} diff --git a/examples/react-vite/.env.example b/examples/react-vite/.env.example new file mode 100644 index 0000000..3de7351 --- /dev/null +++ b/examples/react-vite/.env.example @@ -0,0 +1 @@ +VITE_DECART_API_KEY=your-api-key-here diff --git a/examples/react-vite/.gitignore b/examples/react-vite/.gitignore new file mode 100644 index 0000000..9c97bbd --- /dev/null +++ b/examples/react-vite/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +.env diff --git a/examples/react-vite/README.md b/examples/react-vite/README.md new file mode 100644 index 0000000..c184582 --- /dev/null +++ b/examples/react-vite/README.md @@ -0,0 +1,47 @@ +# React + Vite Realtime Example + +A React application with Vite demonstrating real-time video transformation with the Decart SDK. + +## Setup + +1. Copy `.env.example` to `.env` and add your API key: + +```sh +cp .env.example .env +``` + +2. Install dependencies & build: + +```sh +pnpm install +pnpm build +``` + +3. Start the development server: + +```sh +pnpm dev +``` + +4. Open [http://localhost:5173](http://localhost:5173) in your browser. + +## Features + +- Real-time webcam video transformation +- Dynamic style prompt updates +- Connection state management +- Error handling + +## How it works + +1. The app captures your webcam feed using `getUserMedia` +2. The video stream is sent to Decart's realtime API +3. The transformed video is displayed side-by-side with the original +4. You can change the style prompt in real-time + +## Models + +This example uses `mirage_v2` for style transformation. You can also use: + +- `mirage` - MirageLSD video restyling model (older) +- `lucy_v2v_720p_rt` - Lucy for video editing (add objects, change elements) diff --git a/examples/react-vite/index.html b/examples/react-vite/index.html new file mode 100644 index 0000000..d93c01c --- /dev/null +++ b/examples/react-vite/index.html @@ -0,0 +1,12 @@ + + + + + + Decart Realtime Demo + + +
+ + + diff --git a/examples/react-vite/package.json b/examples/react-vite/package.json new file mode 100644 index 0000000..77f4f52 --- /dev/null +++ b/examples/react-vite/package.json @@ -0,0 +1,23 @@ +{ + "name": "@example/react-vite", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@decartai/sdk": "workspace:*", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^4.3.0", + "typescript": "^5.8.0", + "vite": "^6.0.0" + } +} diff --git a/examples/react-vite/src/App.tsx b/examples/react-vite/src/App.tsx new file mode 100644 index 0000000..cc620a3 --- /dev/null +++ b/examples/react-vite/src/App.tsx @@ -0,0 +1,28 @@ +import { useState } from "react"; +import { VideoStream } from "./components/VideoStream"; + +function App() { + const [prompt, setPrompt] = useState("anime style, vibrant colors"); + + return ( +
+

Decart Realtime Demo

+ +
+ +
+ + +
+ ); +} + +export default App; diff --git a/examples/react-vite/src/components/VideoStream.tsx b/examples/react-vite/src/components/VideoStream.tsx new file mode 100644 index 0000000..53e441b --- /dev/null +++ b/examples/react-vite/src/components/VideoStream.tsx @@ -0,0 +1,109 @@ +import { + createDecartClient, + type DecartSDKError, + models, + type RealTimeClient, +} from "@decartai/sdk"; +import { useEffect, useRef, useState } from "react"; + +interface VideoStreamProps { + prompt: string; +} + +export function VideoStream({ prompt }: VideoStreamProps) { + const inputRef = useRef(null); + const outputRef = useRef(null); + const realtimeClientRef = useRef(null); + const [status, setStatus] = useState("idle"); + + useEffect(() => { + let mounted = true; + + async function start() { + try { + const model = models.realtime("mirage_v2"); + + setStatus("requesting camera..."); + const stream = await navigator.mediaDevices.getUserMedia({ + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + if (!mounted) return; + + if (inputRef.current) { + inputRef.current.srcObject = stream; + } + + setStatus("connecting..."); + + const apiKey = import.meta.env.VITE_DECART_API_KEY; + if (!apiKey) { + throw new Error("DECART_API_KEY is not set"); + } + + const client = createDecartClient({ + apiKey, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (transformedStream: MediaStream) => { + if (outputRef.current) { + outputRef.current.srcObject = transformedStream; + } + }, + initialState: { + prompt: { text: prompt, enhance: true }, + }, + }); + + realtimeClientRef.current = realtimeClient; + + // Subscribe to events + realtimeClient.on("connectionChange", (state) => { + setStatus(state); + }); + + realtimeClient.on("error", (error: DecartSDKError) => { + setStatus(`error: ${error.message}`); + }); + } catch (error) { + setStatus(`error: ${error}`); + } + } + + start(); + + return () => { + mounted = false; + realtimeClientRef.current?.disconnect(); + }; + }, []); + + // Update prompt when it changes + useEffect(() => { + if (realtimeClientRef.current?.isConnected()) { + realtimeClientRef.current.setPrompt(prompt, { enhance: true }); + } + }, [prompt]); + + return ( +
+

Status: {status}

+
+
+

Input

+
+
+

Styled Output

+
+
+
+ ); +} diff --git a/examples/react-vite/src/main.tsx b/examples/react-vite/src/main.tsx new file mode 100644 index 0000000..77d159f --- /dev/null +++ b/examples/react-vite/src/main.tsx @@ -0,0 +1,9 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App"; + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/examples/react-vite/tsconfig.json b/examples/react-vite/tsconfig.json new file mode 100644 index 0000000..498328e --- /dev/null +++ b/examples/react-vite/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "types": ["vite/client"] + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/react-vite/tsconfig.node.json b/examples/react-vite/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/examples/react-vite/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/react-vite/vite.config.ts b/examples/react-vite/vite.config.ts new file mode 100644 index 0000000..081c8d9 --- /dev/null +++ b/examples/react-vite/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], +}); diff --git a/examples/realtime.ts b/examples/realtime.ts deleted file mode 100644 index c5363fd..0000000 --- a/examples/realtime.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - createDecartClient, - type DecartSDKError, - models, - type RealTimeClientConnectOptions, - type RealTimeClientInitialState, -} from "@decartai/sdk"; - -const model = models.realtime("mirage_v2"); - -const stream = await navigator.mediaDevices.getUserMedia({ - audio: true, - video: { - frameRate: model.fps, - width: model.width, - height: model.height, - }, -}); - -// 1. Create a client -const client = createDecartClient({ - baseUrl: "https://custom-endpoint.decart.ai", // optional, defaults to https://api3.decart.ai - apiKey: "dcrt-dLMPLEvXIuYPCpC0U5QKJh7jTH9RK8EoAaMT", -}); - -// 2. Connect to the realtime API -const realtimeClient = await client.realtime.connect(stream, { - model, - onRemoteStream: (stream: MediaStream) => { - console.log("remote stream", stream); - }, - initialState: { - prompt: { - // optional, defaults to undefined, will return the original stream if no prompt is sent - text: "Lego World", - enhance: true, // optional, defaults to true - }, - } satisfies RealTimeClientInitialState, -} satisfies RealTimeClientConnectOptions); - -// 3. Prompt Management -// 3.1 Sending a prompt (fire-and-forget, don't wait for acknowledgment) -realtimeClient.setPrompt("Lego World"); // Returns a promise, but we don't await it - -// 3.2 Sending an already enhanced prompt (skip enhancement) -realtimeClient.setPrompt( - "A very long prompt that is very descriptive and detailed", - { - enhance: false, // optional, defaults to true - }, -); - -// 3.3 Sending a prompt and waiting for server acknowledgment -await realtimeClient.setPrompt("Lego World"); -// 4. State Management - -const isConnected: boolean = realtimeClient.isConnected(); -const connectionState: "connected" | "connecting" | "disconnected" = - realtimeClient.getConnectionState(); -// 4.1 Get the connection state synchronously -console.log("Is connected:", isConnected); -console.log("Connection state:", connectionState); - -// 4.2 Subscribe to connection change events asynchronously -const onConnectionChange = ( - state: "connected" | "connecting" | "disconnected", -) => { - console.log(`Connection state changed to ${state}`); -}; -realtimeClient.on("connectionChange", onConnectionChange); -realtimeClient.off("connectionChange", onConnectionChange); - -// 4.3 Get the session ID -console.log("Session ID:", realtimeClient.sessionId); - -// 5. Error Handling -const onError = (error: DecartSDKError) => { - console.error("Error", error); -}; -realtimeClient.on("error", onError); -realtimeClient.off("error", onError); - -// 6. Disconnect -realtimeClient.disconnect(); diff --git a/examples/sdk-core/.env.example b/examples/sdk-core/.env.example new file mode 100644 index 0000000..cbdf351 --- /dev/null +++ b/examples/sdk-core/.env.example @@ -0,0 +1 @@ +DECART_API_KEY=your-api-key-here diff --git a/examples/sdk-core/README.md b/examples/sdk-core/README.md new file mode 100644 index 0000000..596d913 --- /dev/null +++ b/examples/sdk-core/README.md @@ -0,0 +1,105 @@ +# Decart SDK Core + +Quick, runnable examples demonstrating core SDK functionality. + +## Setup + +1. Copy `.env.example` to `.env` and add your API key: + +```sh +cp .env.example .env +``` + +2. From the repo root: + +```sh +pnpm install +pnpm build +``` + +3. Run any example: + +```sh +cd examples/sdk-core +pnpm tsx video/text-to-video.ts +pnpm tsx image/text-to-image.ts +``` + +## Examples + +### Image Generation + +Image models use the synchronous Process API - they return immediately with a Blob. + +- `image/text-to-image.ts` - Generate image from text prompt +- `image/image-to-image.ts` - Transform existing image + +### Video Generation + +Video models use the asynchronous Queue API - jobs are submitted and polled for completion. + +- `video/text-to-video.ts` - Generate video from text prompt +- `video/image-to-video.ts` - Generate video from image +- `video/video-to-video.ts` - Transform existing video +- `video/first-last-frame.ts` - Generate video from first/last frames +- `video/manual-polling.ts` - Manual job status polling + +### Realtime (Browser-only) + +These examples require browser APIs (WebRTC) and are for reference. +See `examples/nextjs-realtime` or `examples/react-vite` for runnable demos. + +- `realtime/mirage-basic.ts` - Basic Mirage connection (style transformation) +- `realtime/mirage-v2-basic.ts` - Mirage v2 connection (improved style transformation) +- `realtime/lucy-v2v-720p.ts` - Lucy v2v realtime (video editing - add objects, change elements) +- `realtime/connection-events.ts` - Handling connection state and errors +- `realtime/prompt-update.ts` - Updating prompt dynamically + +## API Reference + +### Image Models (Process API) + +```typescript +// Text-to-image +const blob = await client.process({ + model: models.image("lucy-pro-t2i"), + prompt: "A beautiful sunset", +}); + +// Image-to-image +const blob = await client.process({ + model: models.image("lucy-pro-i2i"), + prompt: "Transform to watercolor style", + data: imageBlob, +}); +``` + +### Video Models (Queue API) + +```typescript +// Automatic polling +const result = await client.queue.submitAndPoll({ + model: models.video("lucy-pro-t2v"), + prompt: "A cat playing piano", + onStatusChange: (job) => console.log(job.status), +}); + +// Manual polling +const job = await client.queue.submit({ ... }); +const status = await client.queue.status(job.job_id); +const blob = await client.queue.result(job.job_id); +``` + +### Realtime (WebRTC) + +```typescript +const realtimeClient = await client.realtime.connect(stream, { + model: models.realtime("mirage_v2"), + onRemoteStream: (transformedStream) => { ... }, + initialState: { prompt: { text: "anime style", enhance: true } }, +}); + +realtimeClient.setPrompt("new style"); +realtimeClient.on("connectionChange", (state) => { ... }); +realtimeClient.disconnect(); +``` diff --git a/examples/sdk-core/image/image-to-image.ts b/examples/sdk-core/image/image-to-image.ts new file mode 100644 index 0000000..b48721b --- /dev/null +++ b/examples/sdk-core/image/image-to-image.ts @@ -0,0 +1,25 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Transforming image..."); + + // Read input image + const inputImage = fs.readFileSync("input.png"); + + const blob = await client.process({ + model: models.image("lucy-pro-i2i"), + prompt: "Transform to watercolor painting style", + data: new Blob([inputImage]), + }); + + // Save to file + const output = Buffer.from(await blob.arrayBuffer()); + fs.writeFileSync("output.png", output); + console.log("Image saved to output.png"); +}); diff --git a/examples/sdk-core/image/text-to-image.ts b/examples/sdk-core/image/text-to-image.ts new file mode 100644 index 0000000..d9ed084 --- /dev/null +++ b/examples/sdk-core/image/text-to-image.ts @@ -0,0 +1,21 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Generating image from text..."); + + const blob = await client.process({ + model: models.image("lucy-pro-t2i"), + prompt: "A cyberpunk cityscape at night with neon lights", + }); + + // Save to file + const output = Buffer.from(await blob.arrayBuffer()); + fs.writeFileSync("output.png", output); + console.log("Image saved to output.png"); +}); diff --git a/examples/sdk-core/lib/run.ts b/examples/sdk-core/lib/run.ts new file mode 100644 index 0000000..c244a07 --- /dev/null +++ b/examples/sdk-core/lib/run.ts @@ -0,0 +1,8 @@ +import "dotenv/config"; + +export function run(fn: () => Promise) { + fn().catch((error) => { + console.error("Error:", error); + process.exit(1); + }); +} diff --git a/examples/sdk-core/package.json b/examples/sdk-core/package.json new file mode 100644 index 0000000..b32f21c --- /dev/null +++ b/examples/sdk-core/package.json @@ -0,0 +1,18 @@ +{ + "name": "@example/sdk-core", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@decartai/sdk": "workspace:*", + "dotenv": "^16.4.0" + }, + "devDependencies": { + "@types/node": "^22.0.0", + "tsx": "^4.19.0", + "typescript": "^5.8.0" + } +} diff --git a/examples/sdk-core/realtime/connection-events.ts b/examples/sdk-core/realtime/connection-events.ts new file mode 100644 index 0000000..f33ca45 --- /dev/null +++ b/examples/sdk-core/realtime/connection-events.ts @@ -0,0 +1,63 @@ +/** + * Browser-only example - requires WebRTC APIs + * Demonstrates connection state handling and error events + * See examples/nextjs-realtime or examples/react-vite for runnable demos + */ + +import { createDecartClient, type DecartSDKError, models } from "@decartai/sdk"; + +async function main() { + const model = models.realtime("mirage_v2"); + + const stream = await navigator.mediaDevices.getUserMedia({ + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (transformedStream) => { + console.log("Received transformed stream"); + const video = document.getElementById("output") as HTMLVideoElement; + video.srcObject = transformedStream; + }, + }); + + // Subscribe to connection state changes + realtimeClient.on("connectionChange", (state) => { + switch (state) { + case "connecting": + console.log("Connecting to server..."); + break; + case "connected": + console.log("Connected! Streaming active."); + break; + case "disconnected": + console.log("Disconnected from server."); + break; + } + }); + + // Subscribe to errors + realtimeClient.on("error", (error: DecartSDKError) => { + console.error("Error:", error.message); + }); + + // Check connection state synchronously + console.log("Is connected:", realtimeClient.isConnected()); + console.log("Connection state:", realtimeClient.getConnectionState()); + + // Cleanup on page unload + window.addEventListener("beforeunload", () => { + realtimeClient.disconnect(); + }); +} + +main(); diff --git a/examples/sdk-core/realtime/lucy-v2v-720p.ts b/examples/sdk-core/realtime/lucy-v2v-720p.ts new file mode 100644 index 0000000..9ba2694 --- /dev/null +++ b/examples/sdk-core/realtime/lucy-v2v-720p.ts @@ -0,0 +1,46 @@ +/** + * Browser-only example - requires WebRTC APIs + * Lucy v2v for realtime video editing (add objects, change elements) + * See examples/nextjs-realtime or examples/react-vite for runnable demos + */ + +import { createDecartClient, models } from "@decartai/sdk"; + +async function main() { + const model = models.realtime("lucy_v2v_720p_rt"); + + const stream = await navigator.mediaDevices.getUserMedia({ + audio: true, + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (editedStream) => { + const video = document.getElementById("output") as HTMLVideoElement; + video.srcObject = editedStream; + }, + initialState: { + prompt: { + text: "Add a small dog in the background", + enhance: true, + }, + }, + }); + + // Apply different edits + realtimeClient.setPrompt("Change the person's shirt to red"); + realtimeClient.setPrompt("Add sunglasses to the person"); + + console.log("Session ID:", realtimeClient.sessionId); +} + +main(); diff --git a/examples/sdk-core/realtime/mirage-basic.ts b/examples/sdk-core/realtime/mirage-basic.ts new file mode 100644 index 0000000..70f2bb4 --- /dev/null +++ b/examples/sdk-core/realtime/mirage-basic.ts @@ -0,0 +1,43 @@ +/** + * Browser-only example - requires WebRTC APIs + * See examples/nextjs-realtime or examples/react-vite for runnable demos + */ + +import { createDecartClient, models } from "@decartai/sdk"; + +async function main() { + const model = models.realtime("mirage"); + + // Get webcam stream with model-specific settings + const stream = await navigator.mediaDevices.getUserMedia({ + audio: true, + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (transformedStream) => { + const video = document.getElementById("output") as HTMLVideoElement; + video.srcObject = transformedStream; + }, + initialState: { + prompt: { + text: "anime style, vibrant colors", + enhance: true, + }, + }, + }); + + console.log("Session ID:", realtimeClient.sessionId); + console.log("Connected:", realtimeClient.isConnected()); +} + +main(); diff --git a/examples/sdk-core/realtime/mirage-v2-basic.ts b/examples/sdk-core/realtime/mirage-v2-basic.ts new file mode 100644 index 0000000..638c343 --- /dev/null +++ b/examples/sdk-core/realtime/mirage-v2-basic.ts @@ -0,0 +1,48 @@ +/** + * Browser-only example - requires WebRTC APIs + * Mirage v2 for realtime style transformation + * See examples/nextjs-realtime or examples/react-vite for runnable demos + */ + +import { createDecartClient, models } from "@decartai/sdk"; + +async function main() { + const model = models.realtime("mirage_v2"); + + // Get webcam stream with model-specific settings + const stream = await navigator.mediaDevices.getUserMedia({ + audio: true, + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (transformedStream) => { + const video = document.getElementById("output") as HTMLVideoElement; + video.srcObject = transformedStream; + }, + initialState: { + prompt: { + text: "Studio Ghibli animation style", + enhance: true, + }, + }, + }); + + // Change styles dynamically + realtimeClient.setPrompt("Cyberpunk city"); + realtimeClient.setPrompt("Oil painting, renaissance style"); + + console.log("Session ID:", realtimeClient.sessionId); + console.log("Connected:", realtimeClient.isConnected()); +} + +main(); diff --git a/examples/sdk-core/realtime/prompt-update.ts b/examples/sdk-core/realtime/prompt-update.ts new file mode 100644 index 0000000..47902e5 --- /dev/null +++ b/examples/sdk-core/realtime/prompt-update.ts @@ -0,0 +1,52 @@ +/** + * Browser-only example - requires WebRTC APIs + * Demonstrates updating prompts dynamically + * See examples/nextjs-realtime or examples/react-vite for runnable demos + */ + +import { createDecartClient, models } from "@decartai/sdk"; + +async function main() { + const model = models.realtime("mirage_v2"); + + const stream = await navigator.mediaDevices.getUserMedia({ + video: { + frameRate: model.fps, + width: model.width, + height: model.height, + }, + }); + + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + const realtimeClient = await client.realtime.connect(stream, { + model, + onRemoteStream: (transformedStream) => { + const video = document.getElementById("output") as HTMLVideoElement; + video.srcObject = transformedStream; + }, + initialState: { + prompt: { text: "oil painting style", enhance: true }, + }, + }); + + // Update prompt from UI input (fire-and-forget) + const promptInput = document.getElementById("prompt") as HTMLInputElement; + promptInput.addEventListener("input", () => { + realtimeClient.setPrompt(promptInput.value); + }); + + // Update with pre-enhanced prompt (skip server enhancement) + realtimeClient.setPrompt( + "A very detailed and specific prompt that is already well-crafted", + { enhance: false }, + ); + + // Update and wait for acknowledgment + await realtimeClient.setPrompt("cyberpunk city"); + console.log("Prompt updated and acknowledged"); +} + +main(); diff --git a/examples/sdk-core/tsconfig.json b/examples/sdk-core/tsconfig.json new file mode 100644 index 0000000..06ddba5 --- /dev/null +++ b/examples/sdk-core/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist", + "lib": ["ES2022", "DOM", "DOM.Iterable"] + }, + "include": ["**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/examples/sdk-core/video/first-last-frame.ts b/examples/sdk-core/video/first-last-frame.ts new file mode 100644 index 0000000..1e80e73 --- /dev/null +++ b/examples/sdk-core/video/first-last-frame.ts @@ -0,0 +1,32 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Generating video from first/last frames..."); + + const firstFrame = fs.readFileSync("first-frame.png"); + const lastFrame = fs.readFileSync("last-frame.png"); + + const result = await client.queue.submitAndPoll({ + model: models.video("lucy-pro-flf2v"), + prompt: "Smooth transition between scenes", + start: new Blob([firstFrame]), + end: new Blob([lastFrame]), + onStatusChange: (job) => { + console.log(`Job ${job.job_id}: ${job.status}`); + }, + }); + + if (result.status === "completed") { + const output = Buffer.from(await result.data.arrayBuffer()); + fs.writeFileSync("output.mp4", output); + console.log("Video saved to output.mp4"); + } else { + console.log("Job failed:", result.error); + } +}); diff --git a/examples/sdk-core/video/image-to-video.ts b/examples/sdk-core/video/image-to-video.ts new file mode 100644 index 0000000..ac6a6fa --- /dev/null +++ b/examples/sdk-core/video/image-to-video.ts @@ -0,0 +1,30 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Generating video from image..."); + + const inputImage = fs.readFileSync("input.png"); + + const result = await client.queue.submitAndPoll({ + model: models.video("lucy-pro-i2v"), + prompt: "The scene comes to life with gentle motion", + data: new Blob([inputImage]), + onStatusChange: (job) => { + console.log(`Job ${job.job_id}: ${job.status}`); + }, + }); + + if (result.status === "completed") { + const output = Buffer.from(await result.data.arrayBuffer()); + fs.writeFileSync("output.mp4", output); + console.log("Video saved to output.mp4"); + } else { + console.log("Job failed:", result.error); + } +}); diff --git a/examples/sdk-core/video/manual-polling.ts b/examples/sdk-core/video/manual-polling.ts new file mode 100644 index 0000000..033d445 --- /dev/null +++ b/examples/sdk-core/video/manual-polling.ts @@ -0,0 +1,37 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Submitting video generation job..."); + + // Submit job + const job = await client.queue.submit({ + model: models.video("lucy-pro-t2v"), + prompt: "A timelapse of a flower blooming", + }); + + console.log("Job ID:", job.job_id); + console.log("Polling for completion..."); + + // Manual polling loop + let status = await client.queue.status(job.job_id); + while (status.status === "pending" || status.status === "processing") { + console.log(`Status: ${status.status}`); + await new Promise((r) => setTimeout(r, 2000)); + status = await client.queue.status(job.job_id); + } + + if (status.status === "completed") { + const blob = await client.queue.result(job.job_id); + const output = Buffer.from(await blob.arrayBuffer()); + fs.writeFileSync("output.mp4", output); + console.log("Video saved to output.mp4"); + } else { + console.log("Job failed"); + } +}); diff --git a/examples/sdk-core/video/text-to-video.ts b/examples/sdk-core/video/text-to-video.ts new file mode 100644 index 0000000..5ed8a33 --- /dev/null +++ b/examples/sdk-core/video/text-to-video.ts @@ -0,0 +1,27 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Generating video from text..."); + + const result = await client.queue.submitAndPoll({ + model: models.video("lucy-pro-t2v"), + prompt: "An astronaut riding a horse on Mars, cinematic lighting", + onStatusChange: (job) => { + console.log(`Job ${job.job_id}: ${job.status}`); + }, + }); + + if (result.status === "completed") { + const output = Buffer.from(await result.data.arrayBuffer()); + fs.writeFileSync("output.mp4", output); + console.log("Video saved to output.mp4"); + } else { + console.log("Job failed:", result.error); + } +}); diff --git a/examples/sdk-core/video/video-to-video.ts b/examples/sdk-core/video/video-to-video.ts new file mode 100644 index 0000000..0195099 --- /dev/null +++ b/examples/sdk-core/video/video-to-video.ts @@ -0,0 +1,30 @@ +import fs from "node:fs"; +import { createDecartClient, models } from "@decartai/sdk"; +import { run } from "../lib/run"; + +run(async () => { + const client = createDecartClient({ + apiKey: process.env.DECART_API_KEY!, + }); + + console.log("Transforming video..."); + + const inputVideo = fs.readFileSync("input.mp4"); + + const result = await client.queue.submitAndPoll({ + model: models.video("lucy-pro-v2v"), + prompt: "Transform to anime style", + data: new Blob([inputVideo]), + onStatusChange: (job) => { + console.log(`Job ${job.job_id}: ${job.status}`); + }, + }); + + if (result.status === "completed") { + const output = Buffer.from(await result.data.arrayBuffer()); + fs.writeFileSync("output.mp4", output); + console.log("Video saved to output.mp4"); + } else { + console.log("Job failed:", result.error); + } +}); diff --git a/package.json b/package.json index 3cc5534..a618c62 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "release": "bumpp" }, "devDependencies": { + "@types/bun": "^1.3.3", "@types/node": "^22.15.17", "biome": "^0.3.3", "bumpp": "^10.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 081d210..48f486c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,9 @@ importers: specifier: ^4.0.17 version: 4.0.17 devDependencies: + '@types/bun': + specifier: ^1.3.3 + version: 1.3.3 '@types/node': specifier: ^22.15.17 version: 22.17.1 @@ -44,17 +47,165 @@ importers: version: 5.9.2 vite: specifier: ^7.1.2 - version: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1) + version: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: ^3.1.3 - version: 3.2.4(@types/node@22.17.1)(jiti@2.5.1)(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(yaml@2.8.1) + version: 3.2.4(@types/node@22.17.1)(jiti@2.5.1)(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(tsx@4.21.0)(yaml@2.8.1) + + examples/bun-cli: + dependencies: + '@decartai/sdk': + specifier: workspace:* + version: link:../.. + devDependencies: + '@types/bun': + specifier: latest + version: 1.3.3 + + examples/express-api: + dependencies: + '@decartai/sdk': + specifier: workspace:* + version: link:../.. + dotenv: + specifier: ^16.4.0 + version: 16.6.1 + express: + specifier: ^4.21.0 + version: 4.22.1 + devDependencies: + '@types/express': + specifier: ^4.17.0 + version: 4.17.25 + '@types/node': + specifier: ^22.0.0 + version: 22.17.1 + tsx: + specifier: ^4.19.0 + version: 4.21.0 + typescript: + specifier: ^5.8.0 + version: 5.9.2 + + examples/nextjs-realtime: + dependencies: + '@decartai/sdk': + specifier: workspace:* + version: link:../.. + next: + specifier: ^15.0.0 + version: 15.5.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + react: + specifier: ^19.0.0 + version: 19.2.1 + react-dom: + specifier: ^19.0.0 + version: 19.2.1(react@19.2.1) + devDependencies: + '@types/node': + specifier: ^22.0.0 + version: 22.17.1 + '@types/react': + specifier: ^19.0.0 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.0.0 + version: 19.2.3(@types/react@19.2.7) + typescript: + specifier: ^5.8.0 + version: 5.9.2 + + examples/react-vite: + dependencies: + '@decartai/sdk': + specifier: workspace:* + version: link:../.. + react: + specifier: ^19.0.0 + version: 19.2.1 + react-dom: + specifier: ^19.0.0 + version: 19.2.1(react@19.2.1) + devDependencies: + '@types/react': + specifier: ^19.0.0 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.0.0 + version: 19.2.3(@types/react@19.2.7) + '@vitejs/plugin-react': + specifier: ^4.3.0 + version: 4.7.0(vite@6.4.1(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1)) + typescript: + specifier: ^5.8.0 + version: 5.9.2 + vite: + specifier: ^6.0.0 + version: 6.4.1(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) + + examples/sdk-core: + dependencies: + '@decartai/sdk': + specifier: workspace:* + version: link:../.. + dotenv: + specifier: ^16.4.0 + version: 16.6.1 + devDependencies: + '@types/node': + specifier: ^22.0.0 + version: 22.17.1 + tsx: + specifier: ^4.19.0 + version: 4.21.0 + typescript: + specifier: ^5.8.0 + version: 5.9.2 packages: + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.28.3': resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -63,15 +214,56 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.28.3': resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} @@ -93,156 +285,449 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.9': resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.9': resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.9': resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.9': resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.9': resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.9': resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.9': resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.9': resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.9': resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.9': resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.9': resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.9': resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.9': resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.9': resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.9': resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.9': resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.9': resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.9': resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.9': resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.9': resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.9': resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.9': resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.9': resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.9': resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.9': resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/ansi@1.0.0': resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} engines: {node: '>=18'} @@ -281,6 +766,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -302,6 +790,57 @@ packages: '@napi-rs/wasm-runtime@1.1.0': resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} + + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@octokit/action@6.1.0': resolution: {integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==} engines: {node: '>= 18'} @@ -450,6 +989,9 @@ packages: cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} @@ -553,12 +1095,36 @@ packages: cpu: [x64] os: [win32] + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bun@1.3.3': + resolution: {integrity: sha512-ogrKbJ2X5N0kWLLFKeytG0eHDleBYtngtlbu9cyBKFtNL3cnpDZkNdQj8flVf6WTZUX5ulI9AY1oa7ljhSrp+g==} + '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -568,15 +1134,56 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + '@types/node@22.17.1': resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} @@ -606,6 +1213,10 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -644,6 +1255,9 @@ packages: args-tokenizer@0.3.0: resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} @@ -671,6 +1285,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + baseline-browser-mapping@2.9.0: + resolution: {integrity: sha512-Mh++g+2LPfzZToywfE1BUzvZbfOY52Nil0rn9H1CPC5DJ7fX+Vir7nToBeoiSbB1zTNeGYbELEvJESujgGrzXw==} + hasBin: true + bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -687,14 +1305,30 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + body-parser@1.20.4: + resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bumpp@10.2.3: resolution: {integrity: sha512-nsFBZACxuBVu6yzDSaZZaWpX5hTQ+++9WtYkmO+0Bd3cpSq0Mzvqw5V83n+fOyRj3dYuZRFCQf5Z9NNfZj+Rnw==} engines: {node: '>=18'} hasBin: true + bun-types@1.3.3: + resolution: {integrity: sha512-z3Xwlg7j2l9JY27x5Qn3Wlyos8YAp0kKRlrePAOjgjMGS5IG6E7Jnlx736vH9UVI4wUICwwhC9anYL++XeOgTQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + c12@3.2.0: resolution: {integrity: sha512-ixkEtbYafL56E6HiFuonMm1ZjoKtIo7TH68/uiEq4DAwv9NcUX2nJ95F8TrbMeNjqIkZpruo3ojXQJ+MGG5gcQ==} peerDependencies: @@ -707,9 +1341,20 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -743,6 +1388,9 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -778,6 +1426,20 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -793,10 +1455,21 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -821,16 +1494,32 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dotenv@17.2.1: resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} engines: {node: '>=12'} @@ -844,6 +1533,10 @@ packages: oxc-resolver: optional: true + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + earlgrey-runtime@0.1.2: resolution: {integrity: sha512-T4qoScXi5TwALDv8nlGTvOuCT8jXcKcxtO8qVdqv46IA2GHJfQzwoBPbkOmORnyhu3A98cVVuhWLsM2CzPljJg==} @@ -853,6 +1546,12 @@ packages: editor@1.0.0: resolution: {integrity: sha512-SoRmbGStwNYHgKfjOrX2L0mUvp9bUVv0uPppZSOMAntEbcFtoC3MKF5b3T6HQPXKIV+QGY3xPO3JK5it5lVkuw==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.263: + resolution: {integrity: sha512-DrqJ11Knd+lo+dv+lltvfMDLU27g14LMdH2b0O3Pio4uk0x+z7OR+JrmyacTPN2M8w3BrZ7/RTwG3R9B7irPlg==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -860,18 +1559,46 @@ packages: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + esbuild@0.25.9: resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -879,6 +1606,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + exit-hook@1.1.1: resolution: {integrity: sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==} engines: {node: '>=0.10.0'} @@ -887,6 +1618,10 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} + express@4.22.1: + resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} + engines: {node: '>= 0.10.0'} + exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} @@ -920,6 +1655,10 @@ packages: resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} engines: {node: '>=14.16'} + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} @@ -927,6 +1666,14 @@ packages: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + fs-extra@0.26.7: resolution: {integrity: sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q==} @@ -942,10 +1689,25 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -960,6 +1722,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -980,16 +1746,36 @@ packages: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1007,6 +1793,10 @@ packages: inquirer@0.11.4: resolution: {integrity: sha512-QR+2TW90jnKk9LUUtbcA3yQXKt2rDEKMh6+BAZQIeumtzHexnwVLdPakSslGijXYLJCzFv7GMXbFCn0pA00EUw==} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-fullwidth-code-point@1.0.0: resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} engines: {node: '>=0.10.0'} @@ -1039,6 +1829,9 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} @@ -1059,6 +1852,11 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} @@ -1084,9 +1882,27 @@ packages: loupe@3.2.0: resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1095,6 +1911,11 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1104,6 +1925,9 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1132,9 +1956,37 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} @@ -1151,9 +2003,17 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -1175,6 +2035,10 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -1183,6 +2047,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -1216,10 +2083,18 @@ packages: pkg-types@2.2.0: resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -1227,6 +2102,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -1246,9 +2125,30 @@ packages: resolution: {integrity: sha512-Pzd/4IFnTb8E+I1P5rbLQoqpUHcXKg48qTYKi4EANg+sTPwGFEMOcYGiiZz6xuQcOMZP7MPsrdAPx+16Q8qahg==} engines: {node: '>=18'} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + react-dom@19.2.1: + resolution: {integrity: sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==} + peerDependencies: + react: ^19.2.1 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@19.2.1: + resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} + engines: {node: '>=0.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1330,11 +2230,42 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.7.2: resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + send@0.19.1: + resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1343,6 +2274,22 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1366,6 +2313,10 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -1399,6 +2350,19 @@ packages: strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -1445,6 +2409,10 @@ packages: resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} hasBin: true + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -1482,6 +2450,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -1496,6 +2469,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + typescript@5.9.2: resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} @@ -1517,6 +2494,10 @@ packages: universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} @@ -1524,6 +2505,12 @@ packages: resolution: {integrity: sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==} engines: {node: '>=4'} + update-browserslist-db@1.2.0: + resolution: {integrity: sha512-Dn+NlSF/7+0lVSEZ57SYQg6/E44arLzsVOGgrElBn/BlG1B8WKdbLppOocFrXwRNTkNlgdGNaBgH1o0lggDPiw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1535,6 +2522,10 @@ packages: resolution: {integrity: sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==} engines: {node: '>=0.10.0'} + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + uuid@13.0.0: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true @@ -1548,6 +2539,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -1557,6 +2552,46 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@7.1.2: resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1650,6 +2685,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} @@ -1679,6 +2717,34 @@ packages: snapshots: + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.28.3': dependencies: '@babel/parser': 7.28.3 @@ -1687,19 +2753,101 @@ snapshots: '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + '@babel/parser@7.28.3': dependencies: '@babel/types': 7.28.2 + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@bundled-es-modules/cookie@2.0.1': dependencies: cookie: 0.7.2 @@ -1727,81 +2875,256 @@ snapshots: '@esbuild/aix-ppc64@0.25.9': optional: true + '@esbuild/aix-ppc64@0.27.0': + optional: true + '@esbuild/android-arm64@0.25.9': optional: true + '@esbuild/android-arm64@0.27.0': + optional: true + '@esbuild/android-arm@0.25.9': optional: true + '@esbuild/android-arm@0.27.0': + optional: true + '@esbuild/android-x64@0.25.9': optional: true + '@esbuild/android-x64@0.27.0': + optional: true + '@esbuild/darwin-arm64@0.25.9': optional: true + '@esbuild/darwin-arm64@0.27.0': + optional: true + '@esbuild/darwin-x64@0.25.9': optional: true + '@esbuild/darwin-x64@0.27.0': + optional: true + '@esbuild/freebsd-arm64@0.25.9': optional: true + '@esbuild/freebsd-arm64@0.27.0': + optional: true + '@esbuild/freebsd-x64@0.25.9': optional: true + '@esbuild/freebsd-x64@0.27.0': + optional: true + '@esbuild/linux-arm64@0.25.9': optional: true + '@esbuild/linux-arm64@0.27.0': + optional: true + '@esbuild/linux-arm@0.25.9': optional: true + '@esbuild/linux-arm@0.27.0': + optional: true + '@esbuild/linux-ia32@0.25.9': optional: true + '@esbuild/linux-ia32@0.27.0': + optional: true + '@esbuild/linux-loong64@0.25.9': optional: true + '@esbuild/linux-loong64@0.27.0': + optional: true + '@esbuild/linux-mips64el@0.25.9': optional: true + '@esbuild/linux-mips64el@0.27.0': + optional: true + '@esbuild/linux-ppc64@0.25.9': optional: true + '@esbuild/linux-ppc64@0.27.0': + optional: true + '@esbuild/linux-riscv64@0.25.9': optional: true + '@esbuild/linux-riscv64@0.27.0': + optional: true + '@esbuild/linux-s390x@0.25.9': optional: true + '@esbuild/linux-s390x@0.27.0': + optional: true + '@esbuild/linux-x64@0.25.9': optional: true + '@esbuild/linux-x64@0.27.0': + optional: true + '@esbuild/netbsd-arm64@0.25.9': optional: true + '@esbuild/netbsd-arm64@0.27.0': + optional: true + '@esbuild/netbsd-x64@0.25.9': optional: true + '@esbuild/netbsd-x64@0.27.0': + optional: true + '@esbuild/openbsd-arm64@0.25.9': optional: true + '@esbuild/openbsd-arm64@0.27.0': + optional: true + '@esbuild/openbsd-x64@0.25.9': optional: true + '@esbuild/openbsd-x64@0.27.0': + optional: true + '@esbuild/openharmony-arm64@0.25.9': optional: true + '@esbuild/openharmony-arm64@0.27.0': + optional: true + '@esbuild/sunos-x64@0.25.9': optional: true + '@esbuild/sunos-x64@0.27.0': + optional: true + '@esbuild/win32-arm64@0.25.9': optional: true + '@esbuild/win32-arm64@0.27.0': + optional: true + '@esbuild/win32-ia32@0.25.9': optional: true + '@esbuild/win32-ia32@0.27.0': + optional: true + '@esbuild/win32-x64@0.25.9': optional: true + '@esbuild/win32-x64@0.27.0': + optional: true + + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + '@inquirer/ansi@1.0.0': {} '@inquirer/confirm@5.1.18(@types/node@22.17.1)': @@ -1830,9 +3153,14 @@ snapshots: optionalDependencies: '@types/node': 22.17.1 - '@jridgewell/gen-mapping@0.3.13': + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/resolve-uri@3.1.2': {} @@ -1867,6 +3195,32 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@next/env@15.5.7': {} + + '@next/swc-darwin-arm64@15.5.7': + optional: true + + '@next/swc-darwin-x64@15.5.7': + optional: true + + '@next/swc-linux-arm64-gnu@15.5.7': + optional: true + + '@next/swc-linux-arm64-musl@15.5.7': + optional: true + + '@next/swc-linux-x64-gnu@15.5.7': + optional: true + + '@next/swc-linux-x64-musl@15.5.7': + optional: true + + '@next/swc-win32-arm64-msvc@15.5.7': + optional: true + + '@next/swc-win32-x64-msvc@15.5.7': + optional: true + '@octokit/action@6.1.0': dependencies: '@octokit/auth-action': 4.1.0 @@ -1995,6 +3349,8 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.53': optional: true + '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/pluginutils@1.0.0-beta.53': {} '@rollup/rollup-android-arm-eabi@4.46.2': @@ -2057,29 +3413,124 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.2 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.2 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.17.1 + + '@types/bun@1.3.3': + dependencies: + bun-types: 1.3.3 + '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.17.1 + '@types/cookie@0.6.0': {} '@types/deep-eql@4.0.2': {} '@types/estree@1.0.8': {} + '@types/express-serve-static-core@4.19.7': + dependencies: + '@types/node': 22.17.1 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@4.17.25': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 + + '@types/http-errors@2.0.5': {} + + '@types/mime@1.3.5': {} + '@types/node@22.17.1': dependencies: undici-types: 6.21.0 + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@19.2.3(@types/react@19.2.7)': + dependencies: + '@types/react': 19.2.7 + + '@types/react@19.2.7': + dependencies: + csstype: 3.2.3 + '@types/retry@0.12.2': {} + '@types/send@0.17.6': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.17.1 + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.17.1 + + '@types/serve-static@1.15.10': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.17.1 + '@types/send': 0.17.6 + '@types/statuses@2.0.6': {} + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.4.1(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) + transitivePeerDependencies: + - supports-color + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.2 @@ -2088,14 +3539,14 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.11.3(@types/node@22.17.1)(typescript@5.9.2) - vite: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -2123,6 +3574,11 @@ snapshots: loupe: 3.2.0 tinyrainbow: 2.0.0 + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + acorn@8.15.0: {} ajv@6.12.6: @@ -2150,6 +3606,8 @@ snapshots: args-tokenizer@0.3.0: {} + array-flatten@1.1.1: {} + asn1@0.2.6: dependencies: safer-buffer: 2.1.2 @@ -2171,6 +3629,8 @@ snapshots: balanced-match@1.0.2: {} + baseline-browser-mapping@2.9.0: {} + bcrypt-pbkdf@1.0.2: dependencies: tweetnacl: 0.14.5 @@ -2193,11 +3653,36 @@ snapshots: bluebird@3.7.2: {} + body-parser@1.20.4: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.0 + caniuse-lite: 1.0.30001759 + electron-to-chromium: 1.5.263 + node-releases: 2.0.27 + update-browserslist-db: 1.2.0(browserslist@4.28.1) + bumpp@10.2.3: dependencies: ansis: 4.1.0 @@ -2214,6 +3699,12 @@ snapshots: transitivePeerDependencies: - magicast + bun-types@1.3.3: + dependencies: + '@types/node': 22.17.1 + + bytes@3.1.2: {} + c12@3.2.0: dependencies: chokidar: 4.0.3 @@ -2231,8 +3722,20 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + call-me-maybe@1.0.2: {} + caniuse-lite@1.0.30001759: {} + caseless@0.12.0: {} chai@5.2.1: @@ -2269,6 +3772,8 @@ snapshots: cli-width@4.1.0: {} + client-only@0.0.1: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -2297,6 +3802,16 @@ snapshots: consola@3.4.2: {} + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.7: {} + cookie@0.7.2: {} core-js@2.6.12: {} @@ -2309,10 +3824,16 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 + debug@2.6.9: + dependencies: + ms: 2.0.0 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -2325,16 +3846,31 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + deprecation@2.3.1: {} destr@2.0.5: {} + destroy@1.2.0: {} + + detect-libc@2.1.2: + optional: true + diff@8.0.2: {} + dotenv@16.6.1: {} + dotenv@17.2.1: {} dts-resolver@2.1.1: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + earlgrey-runtime@0.1.2: dependencies: core-js: 2.6.12 @@ -2349,12 +3885,28 @@ snapshots: editor@1.0.0: {} + ee-first@1.1.1: {} + + electron-to-chromium@1.5.263: {} + emoji-regex@8.0.0: {} empathic@2.0.0: {} + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + es-module-lexer@1.7.0: {} + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + esbuild@0.25.9: optionalDependencies: '@esbuild/aix-ppc64': 0.25.9 @@ -2384,18 +3936,87 @@ snapshots: '@esbuild/win32-ia32': 0.25.9 '@esbuild/win32-x64': 0.25.9 + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 + etag@1.8.1: {} + exit-hook@1.1.1: {} expect-type@1.2.2: {} + express@4.22.1: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.4 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.1 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + exsolve@1.0.7: {} extend@3.0.2: {} @@ -2417,6 +4038,18 @@ snapshots: filter-obj@5.1.0: {} + finalhandler@1.3.2: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + forever-agent@0.6.1: {} form-data@2.3.3: @@ -2425,6 +4058,10 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + forwarded@0.2.0: {} + + fresh@0.5.2: {} + fs-extra@0.26.7: dependencies: graceful-fs: 4.2.11 @@ -2445,8 +4082,30 @@ snapshots: fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -2473,6 +4132,8 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphql@16.11.0: {} @@ -2488,16 +4149,42 @@ snapshots: dependencies: ansi-regex: 2.1.1 + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + headers-polyfill@4.0.3: {} hookable@5.5.3: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-signature@1.2.0: dependencies: assert-plus: 1.0.0 jsprim: 1.4.2 sshpk: 1.18.0 + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} inflight@1.0.6: @@ -2528,6 +4215,8 @@ snapshots: strip-ansi: 3.0.1 through: 2.3.8 + ipaddr.js@1.9.1: {} + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 @@ -2548,6 +4237,8 @@ snapshots: jiti@2.5.1: {} + js-tokens@4.0.0: {} + js-tokens@9.0.1: {} jsbn@0.1.1: {} @@ -2560,6 +4251,8 @@ snapshots: json-stringify-safe@5.0.1: {} + json5@2.2.3: {} + jsonc-parser@3.3.1: {} jsonfile@2.4.0: @@ -2587,16 +4280,30 @@ snapshots: loupe@3.2.0: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 + mime@1.6.0: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 @@ -2610,6 +4317,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + ms@2.0.0: {} + ms@2.1.3: {} msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2): @@ -2650,8 +4359,35 @@ snapshots: nanoid@3.3.11: {} + negotiator@0.6.3: {} + + next@15.5.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + dependencies: + '@next/env': 15.5.7 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001759 + postcss: 8.4.31 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + styled-jsx: 5.1.6(react@19.2.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-fetch-native@1.6.7: {} + node-releases@2.0.27: {} + number-is-nan@1.0.1: {} nypm@0.6.1: @@ -2666,8 +4402,14 @@ snapshots: object-assign@4.1.1: {} + object-inspect@1.13.4: {} + ohash@2.0.11: {} + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -2686,10 +4428,14 @@ snapshots: package-manager-detector@1.3.0: {} + parseurl@1.3.3: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} + path-to-regexp@0.1.12: {} + path-to-regexp@6.3.0: {} pathe@2.0.3: {} @@ -2726,18 +4472,33 @@ snapshots: exsolve: 1.0.7 pathe: 2.0.3 + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + psl@1.15.0: dependencies: punycode: 2.3.1 punycode@2.3.1: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + qs@6.5.3: {} quansync@0.2.10: {} @@ -2759,11 +4520,29 @@ snapshots: quick-lru@7.1.0: {} + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + rc9@2.1.2: dependencies: defu: 6.1.4 destr: 2.0.5 + react-dom@19.2.1(react@19.2.1): + dependencies: + react: 19.2.1 + scheduler: 0.27.0 + + react-refresh@0.17.0: {} + + react@19.2.1: {} + readdirp@4.1.2: {} readline2@1.0.1: @@ -2892,14 +4671,128 @@ snapshots: safer-buffer@2.1.2: {} + scheduler@0.27.0: {} + + semver@6.3.1: {} + semver@7.7.2: {} + semver@7.7.3: + optional: true + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + send@0.19.1: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -2922,6 +4815,8 @@ snapshots: stackback@0.0.2: {} + statuses@2.0.1: {} + statuses@2.0.2: {} std-env@3.9.0: {} @@ -2954,6 +4849,11 @@ snapshots: dependencies: js-tokens: 9.0.1 + styled-jsx@5.1.6(react@19.2.1): + dependencies: + client-only: 0.0.1 + react: 19.2.1 + supports-color@2.0.0: {} thenify-all@1.6.0: @@ -2989,6 +4889,8 @@ snapshots: dependencies: tldts-core: 7.0.16 + toidentifier@1.0.1: {} + tough-cookie@2.5.0: dependencies: psl: 1.15.0 @@ -3024,8 +4926,14 @@ snapshots: - supports-color - vue-tsc - tslib@2.8.1: - optional: true + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.0 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 tunnel-agent@0.6.0: dependencies: @@ -3037,6 +4945,11 @@ snapshots: type-fest@4.41.0: {} + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + typescript@5.9.2: {} ufo@1.6.1: {} @@ -3054,10 +4967,18 @@ snapshots: universal-user-agent@6.0.1: {} + unpipe@1.0.0: {} + until-async@3.0.2: {} untildify@3.0.3: {} + update-browserslist-db@1.2.0(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -3068,25 +4989,29 @@ snapshots: dependencies: os-homedir: 1.0.2 + utils-merge@1.0.1: {} + uuid@13.0.0: {} uuid@3.4.0: {} validate-npm-package-name@5.0.1: {} + vary@1.1.2: {} + verror@1.10.0: dependencies: assert-plus: 1.0.0 core-util-is: 1.0.2 extsprintf: 1.3.0 - vite-node@3.2.4(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -3101,7 +5026,22 @@ snapshots: - tsx - yaml - vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1): + vite@6.4.1(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.2 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 22.17.1 + fsevents: 2.3.3 + jiti: 2.5.1 + tsx: 4.21.0 + yaml: 2.8.1 + + vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) @@ -3113,13 +5053,14 @@ snapshots: '@types/node': 22.17.1 fsevents: 2.3.3 jiti: 2.5.1 + tsx: 4.21.0 yaml: 2.8.1 - vitest@3.2.4(@types/node@22.17.1)(jiti@2.5.1)(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(yaml@2.8.1): + vitest@3.2.4(@types/node@22.17.1)(jiti@2.5.1)(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(tsx@4.21.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.11.3(@types/node@22.17.1)(typescript@5.9.2))(vite@7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3137,8 +5078,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.17.1)(jiti@2.5.1)(yaml@2.8.1) + vite: 7.1.2(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.17.1)(jiti@2.5.1)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.17.1 @@ -3181,6 +5122,8 @@ snapshots: y18n@5.0.8: {} + yallist@3.1.1: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b102071..08baf2b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1 +1,4 @@ +packages: + - 'examples/*' + minimumReleaseAge: 1440