From 3e6af081ef905bd6a4ab5f19241e0cb5d70983fc Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Thu, 15 Jan 2026 22:57:37 -0800 Subject: [PATCH 01/33] Configurable Http Plugin --- examples/http-adapters/.env.example | 3 + examples/http-adapters/README.md | 238 + examples/http-adapters/express/README.md | 123 + examples/http-adapters/express/index.ts | 18 + examples/http-adapters/express/teams-app.ts | 22 + examples/http-adapters/hono/README.md | 147 + examples/http-adapters/hono/hono-adapter.ts | 157 + examples/http-adapters/hono/index.ts | 27 + examples/http-adapters/hono/teams-app.ts | 51 + examples/http-adapters/nextjs/README.md | 75 + examples/http-adapters/nextjs/app/layout.tsx | 18 + examples/http-adapters/nextjs/app/page.tsx | 29 + .../http-adapters/nextjs/app/test/page.tsx | 8 + examples/http-adapters/nextjs/next-env.d.ts | 5 + examples/http-adapters/nextjs/next.config.js | 7 + .../http-adapters/nextjs/nextjs-adapter.ts | 155 + examples/http-adapters/nextjs/server.ts | 25 + examples/http-adapters/nextjs/teams-app.ts | 22 + examples/http-adapters/package.json | 37 + examples/http-adapters/tsconfig.json | 11 + package-lock.json | 14639 ++++++---------- packages/apps/src/plugins/http/adapter.ts | 63 + .../plugins/http/configurable-http-plugin.ts | 216 + .../apps/src/plugins/http/express-adapter.ts | 135 + packages/apps/src/plugins/http/index.ts | 3 + packages/apps/src/plugins/http/plugin.ts | 187 +- packages/botbuilder/src/plugin.ts | 15 +- 27 files changed, 6734 insertions(+), 9702 deletions(-) create mode 100644 examples/http-adapters/.env.example create mode 100644 examples/http-adapters/README.md create mode 100644 examples/http-adapters/express/README.md create mode 100644 examples/http-adapters/express/index.ts create mode 100644 examples/http-adapters/express/teams-app.ts create mode 100644 examples/http-adapters/hono/README.md create mode 100644 examples/http-adapters/hono/hono-adapter.ts create mode 100644 examples/http-adapters/hono/index.ts create mode 100644 examples/http-adapters/hono/teams-app.ts create mode 100644 examples/http-adapters/nextjs/README.md create mode 100644 examples/http-adapters/nextjs/app/layout.tsx create mode 100644 examples/http-adapters/nextjs/app/page.tsx create mode 100644 examples/http-adapters/nextjs/app/test/page.tsx create mode 100644 examples/http-adapters/nextjs/next-env.d.ts create mode 100644 examples/http-adapters/nextjs/next.config.js create mode 100644 examples/http-adapters/nextjs/nextjs-adapter.ts create mode 100644 examples/http-adapters/nextjs/server.ts create mode 100644 examples/http-adapters/nextjs/teams-app.ts create mode 100644 examples/http-adapters/package.json create mode 100644 examples/http-adapters/tsconfig.json create mode 100644 packages/apps/src/plugins/http/adapter.ts create mode 100644 packages/apps/src/plugins/http/configurable-http-plugin.ts create mode 100644 packages/apps/src/plugins/http/express-adapter.ts diff --git a/examples/http-adapters/.env.example b/examples/http-adapters/.env.example new file mode 100644 index 000000000..6827f2ff6 --- /dev/null +++ b/examples/http-adapters/.env.example @@ -0,0 +1,3 @@ +PORT=3978 +CLIENT_ID=your-client-id +CLIENT_SECRET=your-client-secret diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md new file mode 100644 index 000000000..a41bc3aeb --- /dev/null +++ b/examples/http-adapters/README.md @@ -0,0 +1,238 @@ +# HTTP Adapter Examples + +This example demonstrates how to use **teams.ts** with different HTTP frameworks through custom adapters. + +## What is an HTTP Adapter? + +An HTTP adapter bridges a specific HTTP framework (Express, Hono, Next.js, etc.) with the teams.ts `ConfigurableHttpPlugin`. This allows you to: + +- ✅ Use any HTTP framework you prefer +- ✅ Co-locate your bot with existing web applications +- ✅ Maintain full control over server lifecycle +- ✅ Add custom routes alongside your Teams bot + +## Structure + +This example contains three different adapter implementations in separate folders: + +``` +adapters/ +├── express/ # Express adapter (recommended for most) +│ ├── index.ts +│ ├── express-adapter.ts +│ └── teams-app.ts +├── hono/ # Hono adapter (fastest & modern) +│ ├── index.ts +│ ├── hono-adapter.ts +│ └── teams-app.ts +└── nextjs/ # Next.js adapter (full-stack) + ├── server.ts + ├── nextjs-adapter.ts + ├── teams-app.ts + └── app/ # Next.js pages +``` + +## Getting Started + +1. Install dependencies: +```bash +npm install +``` + +2. Copy `.env.example` to `.env` and configure: +```bash +cp .env.example .env +``` + +3. Run the adapter you want to try: +```bash +# Run Express adapter +npm run dev:express + +# Run Hono adapter +npm run dev:hono + +# Run Next.js adapter +npm run dev:nextjs +``` + +All adapters start on `http://localhost:3978` with the Teams bot endpoint at `/api/messages`. + +## Architecture + +``` +┌─────────────────┐ +│ teams.ts App │ +│ │ +│ ┌───────────┐ │ +│ │Configurable│ │ ← Generic plugin (framework-agnostic) +│ │HttpPlugin │ │ +│ └─────┬──────┘ │ +└────────┼─────────┘ + │ + ┌────▼────┐ + │ Adapter │ ← Framework-specific implementation + └────┬────┘ + │ + ┌────▼────────┐ + │ Framework │ ← Express / Hono / Next.js / etc. + │ (HTTP) │ + └─────────────┘ +``` + +## Adapter Implementations + +### 1. Express ([`express/`](./express/)) + +The most common adapter using Express.js. + +**When to use:** +- Starting a new Teams bot project +- You want a simple, well-documented solution +- You need middleware ecosystem (CORS, body parsing, etc.) +- Your team is familiar with Express + +**Key features:** +- Rich middleware ecosystem +- Easy to add custom routes +- Built-in static file serving + +**Usage:** +```bash +npm run dev:express +``` + +See [express/README.md](./express/README.md) for details. + +### 2. Hono ([`hono/`](./hono/)) + +Ultra-fast, lightweight web framework with Web Standards API. + +**When to use:** +- Performance is critical +- You want a modern, TypeScript-first framework +- You prefer Web Standards (Request/Response) over Express +- You want minimal dependencies + +**Key features:** +- One of the fastest Node.js frameworks +- Lightweight with minimal dependencies +- Web Standards API (Request/Response) +- Excellent TypeScript support + +**Usage:** +```bash +npm run dev:hono +``` + +See [hono/README.md](./hono/README.md) for details. + +### 3. Next.js ([`nextjs/`](./nextjs/)) + +Combines a Teams bot with a Next.js web application in a single server. + +**When to use:** +- You have an existing Next.js app and want to add a bot +- You want a web UI and bot in the same project +- You need server-side rendering (SSR) or static generation +- You want React-based admin/config pages for your bot + +**Key features:** +- Bot and web UI in one codebase +- Share code between bot and web app +- Next.js handles all non-bot routes +- Server-side rendering for web pages + +**Usage:** +```bash +npm run dev:nextjs +``` + +See [nextjs/README.md](./nextjs/README.md) for details. + +## Quick Comparison + +| Feature | Express | Hono | Next.js | +|---------|---------|------|---------| +| **Performance** | Good | Excellent | Good | +| **Bundle Size** | Medium | Small | Large | +| **Learning Curve** | Easy | Easy | Medium | +| **Use Case** | General purpose | High performance | Full-stack app | +| **Web UI** | Manual setup | Manual setup | Built-in (React) | +| **TypeScript** | Good | Excellent | Excellent | +| **Middleware** | Rich ecosystem | Growing | Next.js specific | + +## How Adapters Work + +All adapters implement the `IHttpAdapter` interface: + +```typescript +interface IHttpAdapter { + /** + * Get the underlying HTTP server + */ + getServer(): http.Server; + + /** + * Register a route handler + */ + registerRoute(config: IRouteConfig): void; + + /** + * Initialize the adapter (optional) + * Called before routes are registered + */ + initialize?(): Promise; + + /** + * Start the server (optional) + * Called when user calls app.start() or adapter.start() + */ + start?(port: number | string): Promise; +} +``` + +## Usage Pattern + +All adapters follow the same pattern: + +```typescript +import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { MyAdapter } from './my-adapter'; + +// 1. Create adapter +const adapter = new MyAdapter(); + +// 2. Create teams.ts app with adapter +const app = new App({ + plugins: [ + new ConfigurableHttpPlugin(adapter, { skipAuth: true }) + ] +}); + +// 3. Initialize app (registers routes) +await app.initialize(); + +// 4. Manually start the server +await adapter.start(3978); +``` + +## Creating Your Own Adapter + +Want to use a different framework? Creating an adapter is straightforward: + +1. Implement the `IHttpAdapter` interface +2. Convert between your framework's request/response format and teams.ts format +3. Register routes by calling the handler when requests match + +See the adapter implementations in this example for reference: +- [express-adapter.ts](./express/express-adapter.ts) - Most straightforward +- [hono-adapter.ts](./hono/hono-adapter.ts) - Web Standards API +- [nextjs-adapter.ts](./nextjs/nextjs-adapter.ts) - Complex integration + +## Additional Resources + +- [teams.ts Documentation](https://github.com/microsoft/teams.ts) +- [Express Documentation](https://expressjs.com/) +- [Hono Documentation](https://hono.dev/) +- [Next.js Documentation](https://nextjs.org/) diff --git a/examples/http-adapters/express/README.md b/examples/http-adapters/express/README.md new file mode 100644 index 000000000..2c1a324e2 --- /dev/null +++ b/examples/http-adapters/express/README.md @@ -0,0 +1,123 @@ +# Express + teams.ts Example (Adapter Pattern) + +This example demonstrates how to use **Express** with teams.ts using the explicit `ExpressAdapter` and `ConfigurableHttpPlugin`. + +## Why This Example? + +While teams.ts provides `HttpPlugin` (which uses Express internally), this example shows: +1. The **explicit adapter pattern** for consistency with other frameworks +2. How to use `ConfigurableHttpPlugin` + `ExpressAdapter` +3. A pattern that matches Hono, Next.js, and other framework integrations + +## Comparison + +**Traditional approach:** +```typescript +import { App, HttpPlugin } from '@microsoft/teams.apps'; + +const app = new App({ + plugins: [new HttpPlugin()] +}); +``` + +**Adapter pattern (this example):** +```typescript +import { App, ConfigurableHttpPlugin, ExpressAdapter } from '@microsoft/teams.apps'; + +const app = new App({ + plugins: [ + new ConfigurableHttpPlugin(new ExpressAdapter()) + ] +}); +``` + +Both are functionally equivalent, but the adapter pattern provides: +- **Consistency** across all HTTP frameworks +- **Explicit** framework choice +- **Flexibility** to customize the adapter + +## Getting Started + +1. Install dependencies: +```bash +npm install +``` + +2. Copy `.env.example` to `.env` and configure: +```bash +cp .env.example .env +``` + +3. Run the development server: +```bash +npm run dev +``` + +The server will start on `http://localhost:3978` with: +- `/api/messages` - Teams bot endpoint +- Other Express routes can be added + +## How It Works + +```typescript +import { App, ConfigurableHttpPlugin, ExpressAdapter } from '@microsoft/teams.apps'; + +const app = new App({ + plugins: [ + new ConfigurableHttpPlugin( + new ExpressAdapter(), + { skipAuth: true } + ) + ] +}); +``` + +The `ExpressAdapter` handles: +- Creating and managing the Express app +- Converting between Express format and teams.ts format +- Routing Teams bot requests to `/api/messages` +- Server lifecycle management +- CORS and JSON parsing middleware + +## Adding Custom Routes + +Access the underlying Express app through the adapter: + +```typescript +const adapter = new ExpressAdapter(); + +// Add custom routes +adapter.get('/health', (req, res) => { + res.json({ status: 'ok' }); +}); + +adapter.post('/webhook', (req, res) => { + console.log('Webhook received:', req.body); + res.sendStatus(200); +}); + +const app = new App({ + plugins: [new ConfigurableHttpPlugin(adapter)] +}); +``` + +## Benefits of the Adapter Pattern + +1. **Unified API** - Same pattern for Express, Hono, Next.js, etc. +2. **Framework Flexibility** - Easy to switch frameworks +3. **Clear Separation** - Teams logic separate from HTTP framework +4. **Type Safety** - Full TypeScript support +5. **Extensibility** - Easy to create custom adapters + +## When to Use HttpPlugin vs ExpressAdapter + +**Use `HttpPlugin`** when: +- You want the simplest possible setup +- You're okay with Express as the default +- You don't need to customize the Express app before initialization + +**Use `ExpressAdapter`** when: +- You want consistency with other framework examples +- You need to customize the Express app setup +- You want explicit control over the HTTP framework +- You're building a multi-framework library diff --git a/examples/http-adapters/express/index.ts b/examples/http-adapters/express/index.ts new file mode 100644 index 000000000..5ec55e00f --- /dev/null +++ b/examples/http-adapters/express/index.ts @@ -0,0 +1,18 @@ +import 'dotenv/config'; +import { app } from './teams-app'; + +const port = parseInt(process.env.PORT || '3978', 10); + +async function main() { + // Start the app (ExpressAdapter handles server setup) + await app.start(port); + + console.log(`> Server ready on http://localhost:${port}`); + console.log(`> Teams bot endpoint: /api/messages`); + console.log(`> Express server with Teams bot integration`); +} + +main().catch((err) => { + console.error('Failed to start:', err); + process.exit(1); +}); diff --git a/examples/http-adapters/express/teams-app.ts b/examples/http-adapters/express/teams-app.ts new file mode 100644 index 000000000..9c8acb9bc --- /dev/null +++ b/examples/http-adapters/express/teams-app.ts @@ -0,0 +1,22 @@ +import { App, ConfigurableHttpPlugin, ExpressAdapter } from '@microsoft/teams.apps'; + +// Create teams.ts app with ExpressAdapter +// This is functionally equivalent to using HttpPlugin, but demonstrates +// the explicit adapter pattern for consistency with other frameworks +export const app = new App({ + plugins: [ + new ConfigurableHttpPlugin( + new ExpressAdapter(), + { skipAuth: true } + ) + ] +}); + +// Handle incoming messages +app.on('message', async ({ send, activity }) => { + await send(`Echo from Express server: ${activity.text}`); +}); + +// Example: Access the underlying Express app to add custom routes +// const adapter = app.http.adapter as ExpressAdapter; +// adapter.get('/health', (req, res) => res.json({ status: 'ok' })); diff --git a/examples/http-adapters/hono/README.md b/examples/http-adapters/hono/README.md new file mode 100644 index 000000000..498c58313 --- /dev/null +++ b/examples/http-adapters/hono/README.md @@ -0,0 +1,147 @@ +# Hono + teams.ts Example + +This example demonstrates how to **add a Teams bot to your existing Hono server** by "hooking in" the teams.ts adapter. + +> **Note**: The `HonoAdapter` is included in this example (`hono-adapter.ts`) and is not part of the core `@microsoft/teams.apps` package. You can copy and customize it for your own projects. + +## Key Concept + +You already have a Hono server running with your own routes. You simply pass your Hono app to the adapter, and teams.ts adds the `/api/messages` bot endpoint to your existing server. + +```typescript +// 1. Your existing Hono app +const hono = new Hono(); +hono.get('/health', (c) => c.json({ status: 'ok' })); +hono.get('/api/users', (c) => c.json({ users: [...] })); + +// 2. Hook it into teams.ts +const adapter = new HonoAdapter(hono); // ← Pass YOUR Hono app +const app = new App({ + plugins: [new ConfigurableHttpPlugin(adapter)] +}); + +// 3. Initialize (adds /api/messages to your Hono app) +await app.initialize(); + +// 4. Start your server +await adapter.start(3978); +``` + +## Architecture + +``` +Your Hono App (with your routes) + ↓ + HonoAdapter + ↓ +ConfigurableHttpPlugin + ↓ + teams.ts App + ↓ +/api/messages route added to your Hono app +``` + +## Getting Started + +1. Install dependencies: +```bash +cd examples/http-adapters +npm install +``` + +2. Copy `.env.example` to `.env` and configure: +```bash +cp .env.example .env +``` + +3. Run the Hono example: +```bash +npm run dev:hono +``` + +The server will start on `http://localhost:3978` with: +- `/` - Homepage +- `/health` - Health check endpoint +- `/api/users` - Example API endpoint +- `/api/messages` - Teams bot endpoint (added by teams.ts) + +Open http://localhost:3978 in your browser to see all available routes! + +## How It Works + +### 1. Create Your Hono App (`teams-app.ts`) + +```typescript +import { Hono } from 'hono'; + +// Your existing Hono app with your routes +const hono = new Hono(); + +hono.get('/health', (c) => { + return c.json({ status: 'healthy' }); +}); + +hono.get('/api/users', (c) => { + return c.json({ users: [...] }); +}); +``` + +### 2. Hook Into teams.ts + +```typescript +import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { HonoAdapter } from './hono-adapter'; + +// Pass YOUR Hono app to the adapter +const adapter = new HonoAdapter(hono); + +// Create teams.ts app +const app = new App({ + plugins: [new ConfigurableHttpPlugin(adapter, { skipAuth: true })] +}); + +// Handle bot messages +app.on('message', async ({ send, activity }) => { + await send(`Echo: ${activity.text}`); +}); +``` + +### 3. Start Your Server (`index.ts`) + +```typescript +// Initialize teams.ts (adds /api/messages to your Hono app) +await app.initialize(); + +// Start YOUR Hono server +await adapter.start(3978); +``` + +## What the HonoAdapter Does + +The adapter bridges your Hono app with teams.ts: + +1. **Accepts your existing Hono app** - You pass your `Hono` instance to the adapter +2. **Adds Teams bot routes** - When `app.initialize()` is called, it adds `/api/messages` to your Hono app +3. **Converts requests/responses** - Translates between Hono's Web API format and teams.ts format +4. **Manages the server** - Handles starting/stopping the Node.js HTTP server + +## Benefits of Hono + +- **Fast** - One of the fastest Node.js frameworks +- **Lightweight** - Minimal dependencies (~12KB) +- **Web Standards** - Uses Web API (Request/Response) +- **TypeScript** - First-class TypeScript support +- **Middleware** - Rich middleware ecosystem +- **Flexible** - Works with any Node.js server or edge runtime + +## Why This Pattern? + +This pattern demonstrates that teams.ts doesn't take over your server - it integrates with your existing setup: + +✅ You control your Hono app and routes +✅ You can add/remove routes anytime +✅ teams.ts just adds the `/api/messages` endpoint +✅ Everything runs on a single port +✅ No conflicts between your app and the bot + +This is perfect for adding bot functionality to an existing API server! diff --git a/examples/http-adapters/hono/hono-adapter.ts b/examples/http-adapters/hono/hono-adapter.ts new file mode 100644 index 000000000..f9bed2352 --- /dev/null +++ b/examples/http-adapters/hono/hono-adapter.ts @@ -0,0 +1,157 @@ +import http from 'http'; +import { Hono, Context } from 'hono'; +import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/plugins/http/adapter'; + +/** + * Hono adapter for ConfigurableHttpPlugin + * + * Handles Hono-specific HTTP framework concerns: + * - Accepts an existing Hono app (with your own routes) + * - Route registration via Hono routing (adds Teams bot routes) + * - Request/response data extraction and sending + * - Server lifecycle management + */ +export class HonoAdapter implements IHttpAdapter { + protected hono: Hono; + protected server: http.Server; + + /** + * Create adapter with your existing Hono app + * @param hono Your Hono app with your custom routes + */ + constructor(hono: Hono) { + this.hono = hono; + // Create server - will be attached in initialize() + this.server = http.createServer(); + } + + /** + * Get the underlying HTTP server + */ + getServer(): http.Server { + return this.server; + } + + /** + * Register a route with Hono + */ + registerRoute(config: IRouteConfig): void { + const { method, path, handler } = config; + + // Convert handler to Hono handler signature + const honoHandler = async (c: Context) => { + try { + // Parse body the Hono way + let body: any = {}; + if (c.req.method !== 'GET' && c.req.method !== 'HEAD') { + body = await c.req.json().catch(() => ({})); + } + + const headers = Object.fromEntries(c.req.raw.headers.entries()); + + let responseData: { status: number; body: any } | undefined; + + // Provide helpers to the handler + await handler({ + extractRequestData: () => ({ + body, + headers + }), + sendResponse: (response) => { + responseData = response; + } + }); + + // Send the response + if (responseData) { + return c.json(responseData.body, responseData.status as any); + } else { + return c.json({ error: 'No response provided' }, 500); + } + } catch (err) { + console.error('Hono handler error:', err); + return c.json({ error: 'Internal server error' }, 500); + } + }; + + // Register with Hono using the appropriate method + switch (method.toLowerCase()) { + case 'get': + this.hono.get(path, honoHandler); + break; + case 'post': + this.hono.post(path, honoHandler); + break; + case 'put': + this.hono.put(path, honoHandler); + break; + case 'patch': + this.hono.patch(path, honoHandler); + break; + case 'delete': + this.hono.delete(path, honoHandler); + break; + default: + throw new Error(`Unsupported HTTP method: ${method}`); + } + } + + /** + * Initialize - attach Hono request handler to Node.js server + */ + async initialize(): Promise { + // Simple approach: manually convert Node.js request to Web API Request + // This is what @hono/node-server does internally + this.server.on('request', async (req, res) => { + try { + const url = `http://${req.headers.host || 'localhost'}${req.url}`; + + // Read body as string for POST/PUT/PATCH + let bodyData: string | undefined; + if (req.method !== 'GET' && req.method !== 'HEAD') { + bodyData = await new Promise((resolve, reject) => { + let data = ''; + req.on('data', (chunk) => { data += chunk; }); + req.on('end', () => resolve(data)); + req.on('error', reject); + }); + } + + // Create Web API Request for Hono + const webRequest = new Request(url, { + method: req.method, + headers: req.headers as HeadersInit, + body: bodyData + }); + + // Call Hono's fetch - it will route through registered routes and parse JSON + const webResponse = await this.hono.fetch(webRequest); + + // Convert Web API Response to Node.js response + res.statusCode = webResponse.status; + webResponse.headers.forEach((value, key) => { + res.setHeader(key, value); + }); + const body = await webResponse.text(); + res.end(body); + } catch (err) { + console.error('Hono adapter error:', err); + res.statusCode = 500; + res.end(JSON.stringify({ error: 'Internal server error' })); + } + }); + } + + /** + * Start the server + */ + async start(port: number): Promise { + return new Promise((resolve, reject) => { + this.server.listen(port, () => { + resolve(); + }); + + this.server.once('error', reject); + }); + } +} diff --git a/examples/http-adapters/hono/index.ts b/examples/http-adapters/hono/index.ts new file mode 100644 index 000000000..c7cca5c4f --- /dev/null +++ b/examples/http-adapters/hono/index.ts @@ -0,0 +1,27 @@ +import 'dotenv/config'; +import { app, adapter } from './teams-app'; + +const port = parseInt(process.env.PORT || '3978', 10); + +async function main() { + console.log('Starting Hono server with Teams bot integration...\n'); + + // Initialize teams.ts app - this adds /api/messages to your Hono app + await app.initialize(); + + // Start your Hono server + await adapter.start(port); + + console.log(`✓ Server ready on http://localhost:${port}`); + console.log(`\nYour Hono routes:`); + console.log(` GET / - Homepage`); + console.log(` GET /health - Health check`); + console.log(` GET /api/users - Users API`); + console.log(` POST /api/messages - Teams bot endpoint (added by teams.ts)`); + console.log(`\nOpen http://localhost:${port} in your browser!`); +} + +main().catch((err) => { + console.error('Failed to start:', err); + process.exit(1); +}); diff --git a/examples/http-adapters/hono/teams-app.ts b/examples/http-adapters/hono/teams-app.ts new file mode 100644 index 000000000..bd6392949 --- /dev/null +++ b/examples/http-adapters/hono/teams-app.ts @@ -0,0 +1,51 @@ +import { Hono } from 'hono'; +import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { HonoAdapter } from './hono-adapter'; + +// 1. Create your Hono app with your own routes +export const hono = new Hono(); + +// Add your custom routes +hono.get('/health', (c) => { + return c.json({ status: 'healthy', timestamp: new Date().toISOString() }); +}); + +hono.get('/api/users', (c) => { + return c.json({ + users: [ + { id: 1, name: 'Alice' }, + { id: 2, name: 'Bob' } + ] + }); +}); + +hono.get('/', (c) => { + return c.html(` + + +

Hono + teams.ts

+

Your Hono server is running with a Teams bot!

+ + + + `); +}); + +// 2. Hook your Hono app into the adapter +export const adapter = new HonoAdapter(hono); + +// 3. Create teams.ts app (will add /api/messages route to your Hono app) +export const app = new App({ + plugins: [ + new ConfigurableHttpPlugin(adapter, { skipAuth: true }) + ] +}); + +// 4. Handle Teams bot messages +app.on('message', async ({ send, activity }) => { + await send(`Echo from Hono server: ${activity.text}`); +}); diff --git a/examples/http-adapters/nextjs/README.md b/examples/http-adapters/nextjs/README.md new file mode 100644 index 000000000..bde318340 --- /dev/null +++ b/examples/http-adapters/nextjs/README.md @@ -0,0 +1,75 @@ +# Next.js + teams.ts Example + +This example demonstrates how to use **Next.js** with teams.ts using a custom `NextjsAdapter`. + +> **Note**: The `NextjsAdapter` is included in this example (`src/nextjs-adapter.ts`) and is not part of the core `@microsoft/teams.apps` package. You can copy and customize it for your own projects. + +## Architecture + +- **Next.js** - React framework with server-side rendering +- **NextjsAdapter** (local) - Intercepts Teams routes before Next.js +- **ConfigurableHttpPlugin** - Generic HTTP plugin that works with any adapter + +## Getting Started + +1. Install dependencies: +```bash +npm install +``` + +2. Copy `.env.example` to `.env` and configure: +```bash +cp .env.example .env +``` + +3. Run the development server: +```bash +npm run dev +``` + +The server will start on `http://localhost:3978` with: +- `/api/messages` - Teams bot endpoint (handled by NextjsAdapter) +- All other routes - Handled by Next.js + +## How It Works + +```typescript +import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { NextjsAdapter } from './nextjs-adapter'; + +// Create adapter and app +const adapter = new NextjsAdapter(undefined, { + dev: process.env.NODE_ENV !== 'production' +}); + +const app = new App({ + plugins: [new ConfigurableHttpPlugin(adapter, { skipAuth: true })] +}); + +// Initialize app (registers routes) +await app.initialize(); + +// Manually start the server +await adapter.start(3978); +``` + +The `NextjsAdapter` handles: +- Creating and managing the Next.js app +- Preparing Next.js (await nextApp.prepare()) +- Intercepting `/api/messages` before Next.js sees it +- Falling back to Next.js for all other routes +- Server lifecycle management + +## Key Features + +- **Route Interception** - Teams bot routes are handled before Next.js +- **Seamless Fallback** - All non-bot routes go to Next.js +- **Manual Server Management** - Full control over server lifecycle +- **TypeScript** - Full type safety + +## Benefits + +- ✅ **Co-located** - Bot and web UI in the same app +- ✅ **No conflicts** - Clean separation of concerns +- ✅ **Simple** - No complex routing logic needed +- ✅ **Flexible** - Easy to customize the adapter diff --git a/examples/http-adapters/nextjs/app/layout.tsx b/examples/http-adapters/nextjs/app/layout.tsx new file mode 100644 index 000000000..a845cccca --- /dev/null +++ b/examples/http-adapters/nextjs/app/layout.tsx @@ -0,0 +1,18 @@ +import type { Metadata } from 'next'; + +export const metadata: Metadata = { + title: 'Next.js + teams.ts', + description: 'A Next.js app integrated with teams.ts SDK', +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/examples/http-adapters/nextjs/app/page.tsx b/examples/http-adapters/nextjs/app/page.tsx new file mode 100644 index 000000000..b46056b17 --- /dev/null +++ b/examples/http-adapters/nextjs/app/page.tsx @@ -0,0 +1,29 @@ +export default function Home() { + return ( +
+

Next.js + teams.ts Integration

+

+ This is a Next.js app that integrates the teams.ts SDK using a shared HTTP server. +

+
    +
  • + Teams Bot Endpoint: POST /api/messages +
  • +
  • + Bot Manifest: GET / (root) +
  • +
  • + This Page: Served by Next.js routing +
  • +
+

How it works:

+
    +
  1. A single HTTP server is created and shared between Next.js and teams.ts
  2. +
  3. Both frameworks register request handlers via server.on('request', handler)
  4. +
  5. teams.ts HttpPlugin sets up Express routes (like /api/messages)
  6. +
  7. Next.js handles its own routes (like this page)
  8. +
  9. We call app.initialize() instead of app.start() to avoid conflicting server.listen() calls
  10. +
+
+ ); +} diff --git a/examples/http-adapters/nextjs/app/test/page.tsx b/examples/http-adapters/nextjs/app/test/page.tsx new file mode 100644 index 000000000..069b0549e --- /dev/null +++ b/examples/http-adapters/nextjs/app/test/page.tsx @@ -0,0 +1,8 @@ +export default function TestPage() { + return ( +
+

Test Page

+

If you can see this, Next.js routing is working!

+
+ ); +} diff --git a/examples/http-adapters/nextjs/next-env.d.ts b/examples/http-adapters/nextjs/next-env.d.ts new file mode 100644 index 000000000..40c3d6809 --- /dev/null +++ b/examples/http-adapters/nextjs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/examples/http-adapters/nextjs/next.config.js b/examples/http-adapters/nextjs/next.config.js new file mode 100644 index 000000000..646be66a6 --- /dev/null +++ b/examples/http-adapters/nextjs/next.config.js @@ -0,0 +1,7 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // Disable default server since we're using a custom server + // This is implicit when using custom server, but good to be explicit +}; + +module.exports = nextConfig; diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts new file mode 100644 index 000000000..aaefa3179 --- /dev/null +++ b/examples/http-adapters/nextjs/nextjs-adapter.ts @@ -0,0 +1,155 @@ +import http from 'http'; +import next from 'next'; +import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/plugins/http/adapter'; + +/** + * Next.js adapter for ConfigurableHttpPlugin + * + * Handles Next.js-specific concerns: + * - Next.js app preparation and initialization + * - Route interception for Teams bot endpoints + * - Fallback to Next.js handler for all other routes + * - Server lifecycle management + */ +export class NextjsAdapter implements IHttpAdapter { + protected nextApp: ReturnType; + protected server: http.Server; + protected isUserProvidedServer: boolean; + protected routes: Map = new Map(); + protected dev: boolean; + protected requestHandlerAttached: boolean = false; + + constructor(server?: http.Server, options?: { dev?: boolean; dir?: string }) { + this.isUserProvidedServer = !!server; + this.dev = options?.dev ?? process.env.NODE_ENV !== 'production'; + + // Create Next.js app + this.nextApp = next({ + dev: this.dev, + dir: options?.dir + }); + + // Always create or use the server in constructor + // ConfigurableHttpPlugin needs it immediately + if (server) { + // User-provided server + this.server = server; + } else { + // Create placeholder server now, will attach handlers in initialize() + this.server = http.createServer(); + } + } + + /** + * Get the underlying HTTP server + */ + getServer(): http.Server { + return this.server; + } + + /** + * Register a route with the adapter + * Routes are stored and handled before Next.js gets the request + */ + registerRoute(config: IRouteConfig): void { + const key = `${config.method.toUpperCase()}:${config.path}`; + this.routes.set(key, config); + } + + /** + * Initialize Next.js - prepare the Next.js app + */ + async initialize(): Promise { + await this.nextApp.prepare(); + + // Only attach the request handler once + if (this.requestHandlerAttached) { + return; + } + + // Create request handler that checks our routes first, then falls back to Next.js + const nextHandler = this.nextApp.getRequestHandler(); + const requestHandler = async (req: http.IncomingMessage, res: http.ServerResponse) => { + const method = req.method?.toUpperCase() || 'GET'; + const url = req.url || '/'; + const path = url.split('?')[0]; // Remove query string + + // Check if we have a registered route for this path + const key = `${method}:${path}`; + const route = this.routes.get(key); + + if (route) { + // Handle with our route handler + try { + // Parse body for POST/PUT/PATCH requests + let body: any = {}; + if (['POST', 'PUT', 'PATCH'].includes(method)) { + body = await this.parseBody(req); + } + + const headers = req.headers as Record; + + await route.handler({ + extractRequestData: () => ({ body, headers }), + sendResponse: (response) => { + res.statusCode = response.status; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify(response.body)); + } + }); + } catch (err) { + console.error('Route handler error:', err); + res.statusCode = 500; + res.end(JSON.stringify({ error: 'Internal server error' })); + } + } else { + // Let Next.js handle it + await nextHandler(req, res); + } + }; + + // Attach request handler to the server created in constructor + this.server.on('request', requestHandler); + this.requestHandlerAttached = true; + } + + /** + * Start the server + * Throws if server was user-provided + */ + async start(port: number): Promise { + if (this.isUserProvidedServer) { + throw new Error( + 'Cannot call start() when server was provided by user. ' + + 'User should call server.listen() directly.' + ); + } + + return new Promise((resolve, reject) => { + this.server.listen(port, () => { + resolve(); + }); + this.server.once('error', reject); + }); + } + + /** + * Parse request body + */ + private async parseBody(req: http.IncomingMessage): Promise { + return new Promise((resolve, reject) => { + let data = ''; + req.on('data', (chunk) => { + data += chunk.toString(); + }); + req.on('end', () => { + try { + resolve(data ? JSON.parse(data) : {}); + } catch (err) { + reject(err); + } + }); + req.on('error', reject); + }); + } +} diff --git a/examples/http-adapters/nextjs/server.ts b/examples/http-adapters/nextjs/server.ts new file mode 100644 index 000000000..848ff3e0a --- /dev/null +++ b/examples/http-adapters/nextjs/server.ts @@ -0,0 +1,25 @@ +import 'dotenv/config'; +import { app, adapter } from './teams-app'; + +const port = parseInt(process.env.PORT || '3978', 10); + +async function main() { + // Initialize the app (registers routes with adapter) + await app.initialize(); + + // Manually start the server + if (adapter.start) { + await adapter.start(port); + } else { + throw new Error('Adapter does not support start()'); + } + + console.log(`> Server ready on http://localhost:${port}`); + console.log(`> Teams bot endpoint: /api/messages`); + console.log(`> Next.js pages are served alongside Teams bot routes`); +} + +main().catch((err) => { + console.error('Failed to start:', err); + process.exit(1); +}); diff --git a/examples/http-adapters/nextjs/teams-app.ts b/examples/http-adapters/nextjs/teams-app.ts new file mode 100644 index 000000000..473a96140 --- /dev/null +++ b/examples/http-adapters/nextjs/teams-app.ts @@ -0,0 +1,22 @@ +import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { NextjsAdapter } from './nextjs-adapter'; + +// Create NextjsAdapter instance +export const adapter = new NextjsAdapter(undefined, { + dev: process.env.NODE_ENV !== 'production' +}); + +// Create teams.ts app with NextjsAdapter +export const app = new App({ + plugins: [ + new ConfigurableHttpPlugin( + adapter, + { skipAuth: true } + ) + ] +}); + +// Handle incoming messages +app.on('message', async ({ send, activity }) => { + await send(`Echo from Next.js + teams.ts: ${activity.text}`); +}); diff --git a/examples/http-adapters/package.json b/examples/http-adapters/package.json new file mode 100644 index 000000000..6e937036f --- /dev/null +++ b/examples/http-adapters/package.json @@ -0,0 +1,37 @@ +{ + "name": "@examples/http-adapters", + "version": "0.0.1", + "private": true, + "license": "MIT", + "scripts": { + "dev:express": "tsx watch express/index.ts", + "dev:hono": "tsx watch hono/index.ts", + "dev:nextjs": "tsx watch nextjs/server.ts", + "start:express": "NODE_ENV=production tsx express/index.ts", + "start:hono": "NODE_ENV=production tsx hono/index.ts", + "start:nextjs": "NODE_ENV=production tsx nextjs/server.ts", + "build:nextjs": "next build" + }, + "dependencies": { + "@hono/node-server": "^1.19.9", + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "cors": "^2.8.5", + "express": "^4.21.0", + "hono": "^4.6.14", + "next": "^14.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/node": "^22.5.4", + "@types/react": "^18.2.0", + "dotenv": "^16.4.5", + "tsx": "^4.20.6", + "typescript": "^5.4.5" + } +} diff --git a/examples/http-adapters/tsconfig.json b/examples/http-adapters/tsconfig.json new file mode 100644 index 000000000..a9a21fdc9 --- /dev/null +++ b/examples/http-adapters/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@microsoft/teams.config/tsconfig.node.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": ".", + "jsx": "preserve", + "lib": ["ES2022", "DOM", "DOM.Iterable"] + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules", "dist", ".next"] +} diff --git a/package-lock.json b/package-lock.json index b9f3946c9..0d6d5e0a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -171,6 +171,33 @@ "typescript": "^5.4.5" } }, + "examples/http-adapters": { + "name": "@examples/http-adapters", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "cors": "^2.8.5", + "express": "^4.21.0", + "hono": "^4.6.14", + "next": "^14.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/node": "^22.5.4", + "@types/react": "^18.2.0", + "dotenv": "^16.4.5", + "tsx": "^4.20.6", + "typescript": "^5.4.5" + } + }, "examples/lights": { "name": "@examples/lights", "version": "0.0.6", @@ -313,8 +340,6 @@ }, "examples/tab/node_modules/react": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -322,8 +347,6 @@ }, "examples/tab/node_modules/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -334,8 +357,6 @@ }, "examples/tab/node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "external/a2a": { @@ -415,8 +436,6 @@ }, "node_modules/@a2a-js/sdk": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-0.3.4.tgz", - "integrity": "sha512-WXMk/UspvQFxesvb8hXyfPE8d3ibpiRie24Yw/5ruMqNJcdwxjfZ1G0gj6vYE/I9RAZD145CNzedpZA2cLV2JQ==", "dependencies": { "uuid": "^11.1.0" }, @@ -434,8 +453,6 @@ }, "node_modules/@azure-rest/core-client": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.3.5.tgz", - "integrity": "sha512-vC8sDkT1xH7jx9erJWQqznMhfPY9k+mrM+4R/rAeb+F+KQCohYYmOEAQmT9CEQxStJ3erjbtpN3GMjAS5tdiYg==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -451,8 +468,6 @@ }, "node_modules/@azure/abort-controller": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -463,8 +478,6 @@ }, "node_modules/@azure/core-auth": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", - "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -477,8 +490,6 @@ }, "node_modules/@azure/core-client": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.3.tgz", - "integrity": "sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -495,9 +506,6 @@ }, "node_modules/@azure/core-http": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.5.tgz", - "integrity": "sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg==", - "deprecated": "This package is no longer supported. Please refer to https://github.com/Azure/azure-sdk-for-js/blob/490ce4dfc5b98ba290dee3b33a6d0876c5f138e2/sdk/core/README.md", "license": "MIT", "dependencies": { "@azure/abort-controller": "^1.0.0", @@ -521,8 +529,6 @@ }, "node_modules/@azure/core-http/node_modules/@azure/abort-controller": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", "license": "MIT", "dependencies": { "tslib": "^2.2.0" @@ -533,8 +539,6 @@ }, "node_modules/@azure/core-http/node_modules/@azure/core-tracing": { "version": "1.0.0-preview.13", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", - "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.0.1", @@ -546,8 +550,6 @@ }, "node_modules/@azure/core-http/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -555,8 +557,6 @@ }, "node_modules/@azure/core-rest-pipeline": { "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.1.tgz", - "integrity": "sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -574,8 +574,6 @@ }, "node_modules/@azure/core-tracing": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", - "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -586,8 +584,6 @@ }, "node_modules/@azure/core-util": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", - "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -599,8 +595,6 @@ }, "node_modules/@azure/identity": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.9.1.tgz", - "integrity": "sha512-986D7Cf1AOwYqSDtO/FnMAyk/Jc8qpftkGsxuehoh4F85MhQ4fICBGX/44+X1y78lN4Sqib3Bsoaoh/FvOGgmg==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -621,8 +615,6 @@ }, "node_modules/@azure/identity/node_modules/@azure/msal-node": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.5.2.tgz", - "integrity": "sha512-mt97ieL+IpD/7Hj7Q6pGTPk3dBgvhkOV1HYyH+PkOakhbOOCEb9flAteDgBfADRXBsYJZT+ZlEbPJa4IDn9HZw==", "license": "MIT", "dependencies": { "@azure/msal-common": "15.5.2", @@ -635,8 +627,6 @@ }, "node_modules/@azure/identity/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -644,8 +634,6 @@ }, "node_modules/@azure/logger": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", - "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", "license": "MIT", "dependencies": { "tslib": "^2.6.2" @@ -656,8 +644,6 @@ }, "node_modules/@azure/msal-browser": { "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.11.1.tgz", - "integrity": "sha512-jPxASelqmP/0R1jZuYW8cboba95M9jpUi2ZqzgftddlAIRZA9KL/YaESuT55zu9+BIPS5Eo2kuhy3q2jjU3whg==", "license": "MIT", "dependencies": { "@azure/msal-common": "15.5.2" @@ -668,8 +654,6 @@ }, "node_modules/@azure/msal-common": { "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.5.2.tgz", - "integrity": "sha512-+G85T6oA6i4ubzjOw4BpWd8QCG2FunYN4jaz96gw3SUd8+89vwuiqLg6mtnm/lkPC95bayD+CwuwFn9wvhQGow==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -677,8 +661,6 @@ }, "node_modules/@azure/msal-node": { "version": "2.16.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz", - "integrity": "sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==", "license": "MIT", "dependencies": { "@azure/msal-common": "14.16.0", @@ -691,8 +673,6 @@ }, "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { "version": "14.16.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz", - "integrity": "sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -700,8 +680,6 @@ }, "node_modules/@azure/msal-node/node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -709,8 +687,6 @@ }, "node_modules/@azure/openai": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/openai/-/openai-2.0.0.tgz", - "integrity": "sha512-zSNhwarYbqg3P048uKMjEjbge41OnAgmiiE1elCHVsuCCXRyz2BXnHMJkW6WR6ZKQy5NHswJNUNSWsuqancqFA==", "license": "MIT", "dependencies": { "@azure-rest/core-client": "^2.2.0", @@ -722,8 +698,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -736,8 +710,6 @@ }, "node_modules/@babel/compat-data": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -746,8 +718,6 @@ }, "node_modules/@babel/core": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "dependencies": { @@ -777,8 +747,6 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -787,8 +755,6 @@ }, "node_modules/@babel/generator": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -804,8 +770,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "license": "MIT", "dependencies": { @@ -817,8 +781,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -834,8 +796,6 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -844,8 +804,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", - "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", "dev": true, "license": "MIT", "dependencies": { @@ -866,8 +824,6 @@ }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -876,8 +832,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { @@ -886,8 +840,6 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -900,8 +852,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { @@ -914,8 +864,6 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { @@ -932,8 +880,6 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -945,8 +891,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -955,8 +899,6 @@ }, "node_modules/@babel/helper-replace-supers": { "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", "dependencies": { @@ -973,8 +915,6 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "license": "MIT", "dependencies": { @@ -987,8 +927,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -997,8 +935,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1006,8 +942,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -1016,8 +950,6 @@ }, "node_modules/@babel/helpers": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { @@ -1030,8 +962,6 @@ }, "node_modules/@babel/parser": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1046,9 +976,6 @@ }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, "license": "MIT", "dependencies": { @@ -1064,8 +991,6 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { @@ -1077,8 +1002,6 @@ }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { @@ -1090,8 +1013,6 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { @@ -1103,8 +1024,6 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -1119,8 +1038,6 @@ }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "license": "MIT", "dependencies": { @@ -1135,8 +1052,6 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { @@ -1148,8 +1063,6 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { @@ -1161,8 +1074,6 @@ }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { @@ -1177,8 +1088,6 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -1190,8 +1099,6 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1203,8 +1110,6 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -1216,8 +1121,6 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -1229,8 +1132,6 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1242,8 +1143,6 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -1255,8 +1154,6 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -1271,8 +1168,6 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1287,8 +1182,6 @@ }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1303,8 +1196,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, "license": "MIT", "dependencies": { @@ -1319,8 +1210,6 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, "license": "MIT", "dependencies": { @@ -1335,8 +1224,6 @@ }, "node_modules/@babel/runtime": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1347,8 +1234,6 @@ }, "node_modules/@babel/template": { "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { @@ -1362,8 +1247,6 @@ }, "node_modules/@babel/traverse": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1381,8 +1264,6 @@ }, "node_modules/@babel/types": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { @@ -1395,19 +1276,17 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@changesets/apply-release-plan": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.12.tgz", - "integrity": "sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.14.tgz", + "integrity": "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/config": "^3.1.1", + "@changesets/config": "^3.1.2", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", @@ -1455,8 +1334,6 @@ }, "node_modules/@changesets/changelog-git": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.1.tgz", - "integrity": "sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1464,27 +1341,27 @@ } }, "node_modules/@changesets/cli": { - "version": "2.29.6", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.6.tgz", - "integrity": "sha512-6qCcVsIG1KQLhpQ5zE8N0PckIx4+9QlHK3z6/lwKnw7Tir71Bjw8BeOZaxA/4Jt00pcgCnCSWZnyuZf5Il05QQ==", + "version": "2.29.8", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.8.tgz", + "integrity": "sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==", "dev": true, "license": "MIT", "dependencies": { - "@changesets/apply-release-plan": "^7.0.12", + "@changesets/apply-release-plan": "^7.0.14", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", - "@changesets/config": "^3.1.1", + "@changesets/config": "^3.1.2", "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", - "@changesets/get-release-plan": "^4.0.13", + "@changesets/get-release-plan": "^4.0.14", "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.5", + "@changesets/read": "^0.6.6", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", - "@inquirer/external-editor": "^1.0.0", + "@inquirer/external-editor": "^1.0.2", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", @@ -1504,9 +1381,9 @@ } }, "node_modules/@changesets/config": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.1.tgz", - "integrity": "sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.2.tgz", + "integrity": "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==", "dev": true, "license": "MIT", "dependencies": { @@ -1543,16 +1420,16 @@ } }, "node_modules/@changesets/get-release-plan": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.13.tgz", - "integrity": "sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.14.tgz", + "integrity": "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==", "dev": true, "license": "MIT", "dependencies": { "@changesets/assemble-release-plan": "^6.0.9", - "@changesets/config": "^3.1.1", + "@changesets/config": "^3.1.2", "@changesets/pre": "^2.0.2", - "@changesets/read": "^0.6.5", + "@changesets/read": "^0.6.6", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3" } @@ -1589,14 +1466,34 @@ } }, "node_modules/@changesets/parse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.1.tgz", - "integrity": "sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.2.tgz", + "integrity": "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==", "dev": true, "license": "MIT", "dependencies": { "@changesets/types": "^6.1.0", - "js-yaml": "^3.13.1" + "js-yaml": "^4.1.1" + } + }, + "node_modules/@changesets/parse/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@changesets/parse/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/@changesets/pre": { @@ -1613,15 +1510,15 @@ } }, "node_modules/@changesets/read": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.5.tgz", - "integrity": "sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.6.tgz", + "integrity": "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==", "dev": true, "license": "MIT", "dependencies": { "@changesets/git": "^3.0.4", "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.1", + "@changesets/parse": "^0.4.2", "@changesets/types": "^6.1.0", "fs-extra": "^7.0.1", "p-filter": "^2.1.0", @@ -1641,15 +1538,11 @@ }, "node_modules/@changesets/types": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.1.0.tgz", - "integrity": "sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==", "dev": true, "license": "MIT" }, "node_modules/@changesets/write": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.4.0.tgz", - "integrity": "sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1661,8 +1554,6 @@ }, "node_modules/@changesets/write/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", "bin": { @@ -1677,8 +1568,6 @@ }, "node_modules/@codemirror/autocomplete": { "version": "6.18.6", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", - "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1689,8 +1578,6 @@ }, "node_modules/@codemirror/commands": { "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.1.tgz", - "integrity": "sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1701,8 +1588,6 @@ }, "node_modules/@codemirror/lang-javascript": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz", - "integrity": "sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -1716,8 +1601,6 @@ }, "node_modules/@codemirror/lang-json": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz", - "integrity": "sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -1726,8 +1609,6 @@ }, "node_modules/@codemirror/language": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", - "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1740,8 +1621,6 @@ }, "node_modules/@codemirror/lint": { "version": "6.8.5", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", - "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1751,8 +1630,6 @@ }, "node_modules/@codemirror/search": { "version": "6.5.10", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz", - "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1762,8 +1639,6 @@ }, "node_modules/@codemirror/state": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", - "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -1771,8 +1646,6 @@ }, "node_modules/@codemirror/view": { "version": "6.36.6", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.6.tgz", - "integrity": "sha512-uxugGLet+Nzp0Jcit8Hn3LypM8ioMLKTsdf8FRoT3HWvZtb9GhaWMe0Cc15rz90Ljab4YFJiAulmIVB74OY0IQ==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.5.0", @@ -1782,8 +1655,6 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { @@ -1795,8 +1666,6 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1806,8 +1675,6 @@ }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", "license": "MIT", "engines": { "node": ">=10" @@ -1815,797 +1682,534 @@ }, "node_modules/@emotion/hash": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-array": { + "version": "0.21.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=18" + "node": "*" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/core": { + "version": "0.15.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", - "cpu": [ - "ia32" - ], + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "Python-2.0" }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", - "cpu": [ - "mips64el" - ], + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", - "cpu": [ - "ppc64" - ], + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", - "cpu": [ - "riscv64" - ], + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", - "cpu": [ - "s390x" - ], + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=18" + "node": "*" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/js": { + "version": "9.34.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/object-schema": { + "version": "2.1.6", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "node_modules/@examples/a2a": { + "resolved": "examples/a2a", + "link": true }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } + "node_modules/@examples/ai": { + "resolved": "examples/ai", + "link": true }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } + "node_modules/@examples/auth": { + "resolved": "examples/graph", + "link": true }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@examples/botbuilder": { + "resolved": "examples/botbuilder", + "link": true + }, + "node_modules/@examples/cards": { + "resolved": "examples/cards", + "link": true + }, + "node_modules/@examples/dialogs": { + "resolved": "examples/dialogs", + "link": true + }, + "node_modules/@examples/echo": { + "resolved": "examples/echo", + "link": true + }, + "node_modules/@examples/http-adapters": { + "resolved": "examples/http-adapters", + "link": true + }, + "node_modules/@examples/lights": { + "resolved": "examples/lights", + "link": true + }, + "node_modules/@examples/mcp": { + "resolved": "examples/mcp", + "link": true + }, + "node_modules/@examples/mcpclient": { + "resolved": "examples/mcpclient", + "link": true + }, + "node_modules/@examples/meetings": { + "resolved": "examples/meetings", + "link": true + }, + "node_modules/@examples/message-extensions": { + "resolved": "examples/message-extensions", + "link": true + }, + "node_modules/@examples/tab": { + "resolved": "examples/tab", + "link": true + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "node_modules/@floating-ui/devtools": { + "version": "0.2.1", + "peerDependencies": { + "@floating-ui/dom": ">=1.5.4" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", - "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "node_modules/@floating-ui/react-dom": { + "version": "2.1.6", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "license": "MIT" }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, + "node_modules/@fluentui/keyboard-keys": { + "version": "9.0.8", "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "dependencies": { + "@swc/helpers": "^0.5.1" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/@fluentui/priority-overflow": { + "version": "9.1.15", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@swc/helpers": "^0.5.1" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@fluentui/react-accordion": { + "version": "9.6.8", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@fluentui/react-aria": "^9.14.6", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-motion": "^9.7.2", + "@fluentui/react-motion-components-preview": "^0.4.9", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@fluentui/react-alert": { + "version": "9.0.0-beta.124", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "@fluentui/react-avatar": "^9.6.29", + "@fluentui/react-button": "^9.3.83", + "@fluentui/react-icons": "^2.0.239", + "@fluentui/react-jsx-runtime": "^9.0.39", + "@fluentui/react-tabster": "^9.21.5", + "@fluentui/react-theme": "^9.1.19", + "@fluentui/react-utilities": "^9.18.10", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, + "node_modules/@fluentui/react-aria": { + "version": "9.14.6", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-utilities": "^9.19.0", + "@swc/helpers": "^0.5.1" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, + "node_modules/@fluentui/react-avatar": { + "version": "9.7.6", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@fluentui/react-badge": "^9.2.54", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-popover": "^9.10.6", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-tooltip": "^9.6.6", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/@fluentui/react-badge": { + "version": "9.2.54", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" + }, + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, + "node_modules/@fluentui/react-breadcrumb": { + "version": "9.1.6", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "@fluentui/react-aria": "^9.14.6", + "@fluentui/react-button": "^9.4.6", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-link": "^9.4.6", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/@fluentui/react-button": { + "version": "9.4.6", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.6", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "engines": { - "node": "*" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/js": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", - "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", - "dev": true, + "node_modules/@fluentui/react-card": { + "version": "9.2.5", "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-text": "^9.4.36", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1" }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "peerDependencies": { + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@examples/a2a": { - "resolved": "examples/a2a", - "link": true - }, - "node_modules/@examples/ai": { - "resolved": "examples/ai", - "link": true - }, - "node_modules/@examples/auth": { - "resolved": "examples/graph", - "link": true - }, - "node_modules/@examples/botbuilder": { - "resolved": "examples/botbuilder", - "link": true - }, - "node_modules/@examples/cards": { - "resolved": "examples/cards", - "link": true - }, - "node_modules/@examples/dialogs": { - "resolved": "examples/dialogs", - "link": true - }, - "node_modules/@examples/echo": { - "resolved": "examples/echo", - "link": true - }, - "node_modules/@examples/lights": { - "resolved": "examples/lights", - "link": true - }, - "node_modules/@examples/mcp": { - "resolved": "examples/mcp", - "link": true - }, - "node_modules/@examples/mcpclient": { - "resolved": "examples/mcpclient", - "link": true - }, - "node_modules/@examples/meetings": { - "resolved": "examples/meetings", - "link": true - }, - "node_modules/@examples/message-extensions": { - "resolved": "examples/message-extensions", - "link": true - }, - "node_modules/@examples/tab": { - "resolved": "examples/tab", - "link": true - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/devtools": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/devtools/-/devtools-0.2.1.tgz", - "integrity": "sha512-8PHJLbD6VhBh+LJ1uty/Bz30qs02NXCE5u8WpOhSewlYXUWl03GNXknr9AS2yaAWJEQaY27x7eByJs44gODBcw==", - "peerDependencies": { - "@floating-ui/dom": ">=1.5.4" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", - "dev": true, + "node_modules/@fluentui/react-carousel": { + "version": "9.6.6", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@fluentui/react-aria": "^9.14.6", + "@fluentui/react-button": "^9.4.6", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-icons": "^2.0.245", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-tooltip": "^9.6.6", + "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", + "@swc/helpers": "^0.5.1", + "embla-carousel": "^8.5.1", + "embla-carousel-autoplay": "^8.5.1", + "embla-carousel-fade": "^8.5.1" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@fluentui/keyboard-keys": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@fluentui/keyboard-keys/-/keyboard-keys-9.0.8.tgz", - "integrity": "sha512-iUSJUUHAyTosnXK8O2Ilbfxma+ZyZPMua5vB028Ys96z80v+LFwntoehlFsdH3rMuPsA8GaC1RE7LMezwPBPdw==", - "license": "MIT", - "dependencies": { - "@swc/helpers": "^0.5.1" - } - }, - "node_modules/@fluentui/priority-overflow": { - "version": "9.1.15", - "resolved": "https://registry.npmjs.org/@fluentui/priority-overflow/-/priority-overflow-9.1.15.tgz", - "integrity": "sha512-/3jPBBq64hRdA416grVj+ZeMBUIaKZk2S5HiRg7CKCAV1JuyF84Do0rQI6ns8Vb9XOGuc4kurMcL/UEftoEVrg==", - "license": "MIT", - "dependencies": { - "@swc/helpers": "^0.5.1" + "@types/react": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", + "react": ">=16.14.0 <19.0.0", + "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-accordion": { - "version": "9.6.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-accordion/-/react-accordion-9.6.8.tgz", - "integrity": "sha512-KE3YNGPTsN7tbnAfgbs7THAFfURj+yvO2GgEIVr++2xTgHXR7GEwM7RrbE1ZbJZM7gbeGE5rCg006OBfE4qbuQ==", + "node_modules/@fluentui/react-checkbox": { + "version": "9.3.6", "license": "MIT", "dependencies": { - "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-field": "^9.2.6", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-motion": "^9.7.2", - "@fluentui/react-motion-components-preview": "^0.4.9", + "@fluentui/react-label": "^9.1.87", "@fluentui/react-shared-contexts": "^9.23.1", "@fluentui/react-tabster": "^9.24.6", "@fluentui/react-theme": "^9.1.24", @@ -2620,19 +2224,17 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-alert": { - "version": "9.0.0-beta.124", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.124.tgz", - "integrity": "sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==", + "node_modules/@fluentui/react-color-picker": { + "version": "9.0.4", "license": "MIT", "dependencies": { - "@fluentui/react-avatar": "^9.6.29", - "@fluentui/react-button": "^9.3.83", - "@fluentui/react-icons": "^2.0.239", - "@fluentui/react-jsx-runtime": "^9.0.39", - "@fluentui/react-tabster": "^9.21.5", - "@fluentui/react-theme": "^9.1.19", - "@fluentui/react-utilities": "^9.18.10", + "@ctrl/tinycolor": "^3.3.4", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-utilities": "^9.19.0", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, @@ -2643,17 +2245,23 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-aria": { + "node_modules/@fluentui/react-combobox": { "version": "9.14.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-aria/-/react-aria-9.14.6.tgz", - "integrity": "sha512-3vaEzujXdQxhYFzRXnkDNDImbMS0FXa8pq9WPo0JiKThsQp1QQQzdQbFsY7vfHd9aWjjWyCrRDMH25H37ZZ06w==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", + "@fluentui/react-aria": "^9.14.6", + "@fluentui/react-context-selector": "^9.1.76", + "@fluentui/react-field": "^9.2.6", + "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-portal": "^9.5.6", + "@fluentui/react-positioning": "^9.16.7", "@fluentui/react-shared-contexts": "^9.23.1", "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.19.0", + "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, "peerDependencies": { @@ -2663,22 +2271,69 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-avatar": { - "version": "9.7.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-avatar/-/react-avatar-9.7.6.tgz", - "integrity": "sha512-T4W+CaGjdkWgfiI7Me+wtFj2ewZFH+GpZbSexatqDjoq5ywrFOZf+aADtaHuocHcH7hx/U3AXMvTTQyzoDMuRg==", + "node_modules/@fluentui/react-components": { + "version": "9.63.0", "license": "MIT", "dependencies": { + "@fluentui/react-accordion": "^9.6.8", + "@fluentui/react-alert": "9.0.0-beta.124", + "@fluentui/react-aria": "^9.14.6", + "@fluentui/react-avatar": "^9.7.6", "@fluentui/react-badge": "^9.2.54", - "@fluentui/react-context-selector": "^9.1.76", - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", + "@fluentui/react-breadcrumb": "^9.1.6", + "@fluentui/react-button": "^9.4.6", + "@fluentui/react-card": "^9.2.5", + "@fluentui/react-carousel": "^9.6.6", + "@fluentui/react-checkbox": "^9.3.6", + "@fluentui/react-color-picker": "^9.0.4", + "@fluentui/react-combobox": "^9.14.6", + "@fluentui/react-dialog": "^9.12.8", + "@fluentui/react-divider": "^9.2.86", + "@fluentui/react-drawer": "^9.7.8", + "@fluentui/react-field": "^9.2.6", + "@fluentui/react-image": "^9.1.84", + "@fluentui/react-infobutton": "9.0.0-beta.102", + "@fluentui/react-infolabel": "^9.2.0", + "@fluentui/react-input": "^9.5.6", + "@fluentui/react-label": "^9.1.87", + "@fluentui/react-link": "^9.4.6", + "@fluentui/react-list": "^9.1.6", + "@fluentui/react-menu": "^9.16.6", + "@fluentui/react-message-bar": "^9.4.7", + "@fluentui/react-motion": "^9.7.2", + "@fluentui/react-overflow": "^9.3.6", + "@fluentui/react-persona": "^9.3.6", "@fluentui/react-popover": "^9.10.6", + "@fluentui/react-portal": "^9.5.6", + "@fluentui/react-positioning": "^9.16.7", + "@fluentui/react-progress": "^9.2.6", + "@fluentui/react-provider": "^9.20.6", + "@fluentui/react-radio": "^9.3.6", + "@fluentui/react-rating": "^9.1.6", + "@fluentui/react-search": "^9.1.6", + "@fluentui/react-select": "^9.2.6", "@fluentui/react-shared-contexts": "^9.23.1", + "@fluentui/react-skeleton": "^9.2.6", + "@fluentui/react-slider": "^9.3.7", + "@fluentui/react-spinbutton": "^9.3.6", + "@fluentui/react-spinner": "^9.5.11", + "@fluentui/react-swatch-picker": "^9.2.6", + "@fluentui/react-switch": "^9.2.6", + "@fluentui/react-table": "^9.16.6", + "@fluentui/react-tabs": "^9.7.6", "@fluentui/react-tabster": "^9.24.6", + "@fluentui/react-tag-picker": "^9.5.6", + "@fluentui/react-tags": "^9.5.4", + "@fluentui/react-teaching-popover": "^9.4.5", + "@fluentui/react-text": "^9.4.36", + "@fluentui/react-textarea": "^9.4.6", "@fluentui/react-theme": "^9.1.24", + "@fluentui/react-toast": "^9.4.8", + "@fluentui/react-toolbar": "^9.4.5", "@fluentui/react-tooltip": "^9.6.6", + "@fluentui/react-tree": "^9.10.9", "@fluentui/react-utilities": "^9.19.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.96", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, @@ -2689,38 +2344,33 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-badge": { - "version": "9.2.54", - "resolved": "https://registry.npmjs.org/@fluentui/react-badge/-/react-badge-9.2.54.tgz", - "integrity": "sha512-2PU0UA0VDz/XwbYKmMmPQKg4ykYHoUsgs3oZIqdwMPM3zxuhclsFEFx2xj4nxpMKiGCTBSBTM0fdOEQwRrbluQ==", + "node_modules/@fluentui/react-context-selector": { + "version": "9.1.76", "license": "MIT", "dependencies": { - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", "@types/react-dom": ">=16.9.0 <19.0.0", "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" + "react-dom": ">=16.14.0 <19.0.0", + "scheduler": ">=0.19.0 <=0.23.0" } }, - "node_modules/@fluentui/react-breadcrumb": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-breadcrumb/-/react-breadcrumb-9.1.6.tgz", - "integrity": "sha512-61oH9e/6kBRhnDeSStWe0AMS/9I9nkSzTFEKHEWJDnZYPFIhvlzn56TcAtuzVUYgHV1Jsk5PRLd9aQtJL1ENYw==", + "node_modules/@fluentui/react-dialog": { + "version": "9.12.8", "license": "MIT", "dependencies": { + "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-button": "^9.4.6", + "@fluentui/react-context-selector": "^9.1.76", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-link": "^9.4.6", + "@fluentui/react-motion": "^9.7.2", + "@fluentui/react-motion-components-preview": "^0.4.9", + "@fluentui/react-portal": "^9.5.6", "@fluentui/react-shared-contexts": "^9.23.1", "@fluentui/react-tabster": "^9.24.6", "@fluentui/react-theme": "^9.1.24", @@ -2735,281 +2385,8 @@ "react-dom": ">=16.14.0 <19.0.0" } }, - "node_modules/@fluentui/react-button": { - "version": "9.4.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-button/-/react-button-9.4.6.tgz", - "integrity": "sha512-1G92nGpWOYQ7vR+3g0Y0RLeAlqpZnpHVhXpQG504+yDGIAsn76I1zt+XcD9/2uaDmoH4tXiHS1SPtShujYVXjA==", - "license": "MIT", - "dependencies": { - "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-card": { - "version": "9.2.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-card/-/react-card-9.2.5.tgz", - "integrity": "sha512-ODgwhKt+GL0TbLLRb3kHuf4ftCdcat3uNdN6mcVrqsL3+elJONvd7OA02jFbU/WFVR3IKOx6dUjRYNQYol0CiA==", - "license": "MIT", - "dependencies": { - "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-text": "^9.4.36", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-carousel": { - "version": "9.6.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-carousel/-/react-carousel-9.6.6.tgz", - "integrity": "sha512-/08DyIdg+wn72D+ShnOUQXHqMgAsFUIlCMmyBvNlMImFIDxE6NjVXy+5Yes5mpsJYGWetmCAcECf+SQdgDsU1w==", - "license": "MIT", - "dependencies": { - "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-button": "^9.4.6", - "@fluentui/react-context-selector": "^9.1.76", - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-tooltip": "^9.6.6", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1", - "embla-carousel": "^8.5.1", - "embla-carousel-autoplay": "^8.5.1", - "embla-carousel-fade": "^8.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-checkbox": { - "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-checkbox/-/react-checkbox-9.3.6.tgz", - "integrity": "sha512-70HiPwnR5Ed59bulKs733xTFtm9JHQCJlaJc+l9LR6jpiZucvMqNGDfpYDqvFTbCm+FCrvo6gxmKfADAHxANWw==", - "license": "MIT", - "dependencies": { - "@fluentui/react-field": "^9.2.6", - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-label": "^9.1.87", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-color-picker": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-color-picker/-/react-color-picker-9.0.4.tgz", - "integrity": "sha512-srbVlDDo3iRcjBMH55MPKiDchIN9SWwZfvE4gpJ1PE80Bs8Frjzk1m1iRO7ZkEtedhEqvVzaWYN5BvAQE8S5qg==", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^3.3.4", - "@fluentui/react-context-selector": "^9.1.76", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-combobox": { - "version": "9.14.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-combobox/-/react-combobox-9.14.6.tgz", - "integrity": "sha512-JGkc5wW+NNlMs1P+UIMLWCzYux5SMgFMLjXuXEFP52hX8ka9Nk7l8WSTW58LRsccT5Mf6JXDiSs4CK5D6VXBOA==", - "license": "MIT", - "dependencies": { - "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-context-selector": "^9.1.76", - "@fluentui/react-field": "^9.2.6", - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-portal": "^9.5.6", - "@fluentui/react-positioning": "^9.16.7", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-components": { - "version": "9.63.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.63.0.tgz", - "integrity": "sha512-2Wka+gKv70FbSWp/FUASfNZ4QctBUIl87O44B41VEcX7/ucOsHhF4yVB4KS8dgxnkL30M9mX8COu5c2bORDq4A==", - "license": "MIT", - "dependencies": { - "@fluentui/react-accordion": "^9.6.8", - "@fluentui/react-alert": "9.0.0-beta.124", - "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-avatar": "^9.7.6", - "@fluentui/react-badge": "^9.2.54", - "@fluentui/react-breadcrumb": "^9.1.6", - "@fluentui/react-button": "^9.4.6", - "@fluentui/react-card": "^9.2.5", - "@fluentui/react-carousel": "^9.6.6", - "@fluentui/react-checkbox": "^9.3.6", - "@fluentui/react-color-picker": "^9.0.4", - "@fluentui/react-combobox": "^9.14.6", - "@fluentui/react-dialog": "^9.12.8", - "@fluentui/react-divider": "^9.2.86", - "@fluentui/react-drawer": "^9.7.8", - "@fluentui/react-field": "^9.2.6", - "@fluentui/react-image": "^9.1.84", - "@fluentui/react-infobutton": "9.0.0-beta.102", - "@fluentui/react-infolabel": "^9.2.0", - "@fluentui/react-input": "^9.5.6", - "@fluentui/react-label": "^9.1.87", - "@fluentui/react-link": "^9.4.6", - "@fluentui/react-list": "^9.1.6", - "@fluentui/react-menu": "^9.16.6", - "@fluentui/react-message-bar": "^9.4.7", - "@fluentui/react-motion": "^9.7.2", - "@fluentui/react-overflow": "^9.3.6", - "@fluentui/react-persona": "^9.3.6", - "@fluentui/react-popover": "^9.10.6", - "@fluentui/react-portal": "^9.5.6", - "@fluentui/react-positioning": "^9.16.7", - "@fluentui/react-progress": "^9.2.6", - "@fluentui/react-provider": "^9.20.6", - "@fluentui/react-radio": "^9.3.6", - "@fluentui/react-rating": "^9.1.6", - "@fluentui/react-search": "^9.1.6", - "@fluentui/react-select": "^9.2.6", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-skeleton": "^9.2.6", - "@fluentui/react-slider": "^9.3.7", - "@fluentui/react-spinbutton": "^9.3.6", - "@fluentui/react-spinner": "^9.5.11", - "@fluentui/react-swatch-picker": "^9.2.6", - "@fluentui/react-switch": "^9.2.6", - "@fluentui/react-table": "^9.16.6", - "@fluentui/react-tabs": "^9.7.6", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-tag-picker": "^9.5.6", - "@fluentui/react-tags": "^9.5.4", - "@fluentui/react-teaching-popover": "^9.4.5", - "@fluentui/react-text": "^9.4.36", - "@fluentui/react-textarea": "^9.4.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-toast": "^9.4.8", - "@fluentui/react-toolbar": "^9.4.5", - "@fluentui/react-tooltip": "^9.6.6", - "@fluentui/react-tree": "^9.10.9", - "@fluentui/react-utilities": "^9.19.0", - "@fluentui/react-virtualizer": "9.0.0-alpha.96", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-context-selector": { - "version": "9.1.76", - "resolved": "https://registry.npmjs.org/@fluentui/react-context-selector/-/react-context-selector-9.1.76.tgz", - "integrity": "sha512-GmkHiLuMBzYOVvPkXNhMJTusx9hf43+VizFjAhSfZWOnNwLjiekjDocs7S2XD0f3MmcVx+aB2tRdTDHxGAF/1A==", - "license": "MIT", - "dependencies": { - "@fluentui/react-utilities": "^9.19.0", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0", - "scheduler": ">=0.19.0 <=0.23.0" - } - }, - "node_modules/@fluentui/react-dialog": { - "version": "9.12.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-dialog/-/react-dialog-9.12.8.tgz", - "integrity": "sha512-bfZehsH5ejXc8qO5SZdu50siusz3VhpP1imCVSz92cwsyowjOaGX8DAjfbvb+QfNT/0RYqqdveCXTLPVC7SFWQ==", - "license": "MIT", - "dependencies": { - "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.14.6", - "@fluentui/react-context-selector": "^9.1.76", - "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.54", - "@fluentui/react-motion": "^9.7.2", - "@fluentui/react-motion-components-preview": "^0.4.9", - "@fluentui/react-portal": "^9.5.6", - "@fluentui/react-shared-contexts": "^9.23.1", - "@fluentui/react-tabster": "^9.24.6", - "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.19.0", - "@griffel/react": "^1.5.22", - "@swc/helpers": "^0.5.1" - }, - "peerDependencies": { - "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.9.0 <19.0.0", - "react": ">=16.14.0 <19.0.0", - "react-dom": ">=16.14.0 <19.0.0" - } - }, - "node_modules/@fluentui/react-divider": { - "version": "9.2.86", - "resolved": "https://registry.npmjs.org/@fluentui/react-divider/-/react-divider-9.2.86.tgz", - "integrity": "sha512-8hzwDVdW7CkumW8XU16lsrrg6s0tNAIWdsFC4Utfb/BL2xgfJRdg/0q6Dzw12uhQHtssC3pKNQV0mp4ia0oqww==", + "node_modules/@fluentui/react-divider": { + "version": "9.2.86", "license": "MIT", "dependencies": { "@fluentui/react-jsx-runtime": "^9.0.54", @@ -3028,8 +2405,6 @@ }, "node_modules/@fluentui/react-drawer": { "version": "9.7.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-drawer/-/react-drawer-9.7.8.tgz", - "integrity": "sha512-s9epUHmw/MrkVEpjzZJcdwjYSx2dVM7Uf9deHA//+dgHCM0Yybmn6vWJ+OArNkzdpYHLBuG3Cwk07tnQqGJx2Q==", "license": "MIT", "dependencies": { "@fluentui/react-dialog": "^9.12.8", @@ -3052,8 +2427,6 @@ }, "node_modules/@fluentui/react-field": { "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-field/-/react-field-9.2.6.tgz", - "integrity": "sha512-C+x+96pRgpx1ib08krazPdYn7+lgD7kDGNlvadmUPM05Zm68Zm2mytMjZ/iy50N/iydozmbLG/i930LVUAF7/g==", "license": "MIT", "dependencies": { "@fluentui/react-context-selector": "^9.1.76", @@ -3075,8 +2448,6 @@ }, "node_modules/@fluentui/react-icons": { "version": "2.0.298", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-2.0.298.tgz", - "integrity": "sha512-4bLyZsLtdpS1634ptlBQeoEDlsg//61s8Lp8RlM+TyBgXaIONS9KIlRiujlrGJyuksDujq2V+uEfpqAGrkAHtQ==", "license": "MIT", "dependencies": { "@griffel/react": "^1.0.0", @@ -3088,8 +2459,6 @@ }, "node_modules/@fluentui/react-image": { "version": "9.1.84", - "resolved": "https://registry.npmjs.org/@fluentui/react-image/-/react-image-9.1.84.tgz", - "integrity": "sha512-+8X9IPtNi+RLsSJEIODUfnnalPXLJpfqSyyjrVcm/xjEasCm77F1kMSzCGiHbFYvz7hq5g5I4B/OH4TjL+fcqg==", "license": "MIT", "dependencies": { "@fluentui/react-jsx-runtime": "^9.0.54", @@ -3108,8 +2477,6 @@ }, "node_modules/@fluentui/react-infobutton": { "version": "9.0.0-beta.102", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.102.tgz", - "integrity": "sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.237", @@ -3131,8 +2498,6 @@ }, "node_modules/@fluentui/react-infolabel": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-infolabel/-/react-infolabel-9.2.0.tgz", - "integrity": "sha512-lNxcGj2kcpykdoOW9HSielq7o30RI2vI5LTy4pgd5OQ7/1ffik6+ioKPjylnIV6nIPgv035x4Pf/8s9B6m0+oA==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", @@ -3155,8 +2520,6 @@ }, "node_modules/@fluentui/react-input": { "version": "9.5.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-input/-/react-input-9.5.6.tgz", - "integrity": "sha512-qegsdTawoewipYPYKfuYm21p5VZ59Yl33ofQiGoUgY03r/ddylHenWIOLdFyuUuPXBv2m/ESMCL1MZaiDUPDFg==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3176,8 +2539,6 @@ }, "node_modules/@fluentui/react-jsx-runtime": { "version": "9.0.54", - "resolved": "https://registry.npmjs.org/@fluentui/react-jsx-runtime/-/react-jsx-runtime-9.0.54.tgz", - "integrity": "sha512-zSkP9X/bAFg17QUDBs4bnbDUgeQSpSBVbH4nKYa3cZb78vV3e3m3nyADBvb97NYkywyd7CfIXq8iTpDWVEoWTw==", "license": "MIT", "dependencies": { "@fluentui/react-utilities": "^9.19.0", @@ -3191,8 +2552,6 @@ }, "node_modules/@fluentui/react-label": { "version": "9.1.87", - "resolved": "https://registry.npmjs.org/@fluentui/react-label/-/react-label-9.1.87.tgz", - "integrity": "sha512-vfUppmSWkpwXztHU21oGcduYQ9jldkPrFpl+/zWmbiOia5CKTMqJtHqLJMMe/W1uoNKqoNU37uVp3bZgIWUHJg==", "license": "MIT", "dependencies": { "@fluentui/react-jsx-runtime": "^9.0.54", @@ -3211,8 +2570,6 @@ }, "node_modules/@fluentui/react-link": { "version": "9.4.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-link/-/react-link-9.4.6.tgz", - "integrity": "sha512-PuOyp8JObLWzvUsK8PKjqITtwdcRxonEUxOztvv3HPAyE11EtgdvPKEhm5cQPmXN/EA/D2/Dk80PHLeNRzVaZQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3233,8 +2590,6 @@ }, "node_modules/@fluentui/react-list": { "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-list/-/react-list-9.1.6.tgz", - "integrity": "sha512-Sgl0wVQnJrKFRh4AERtB3eyJERDkSBhH4dGz+KaPaltItWe/0g2/VOqNSOk9oaG3rka7BYSeU6pLUf5AwkqMgA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3257,8 +2612,6 @@ }, "node_modules/@fluentui/react-menu": { "version": "9.16.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-menu/-/react-menu-9.16.6.tgz", - "integrity": "sha512-qiVoje/i8Pj0joZN/uaJd6r0H9qZTgjAEgsnJc32HEXQuX3HDGkxdxiCES+h24a8Alu09ELwVJAzdbWvedCqug==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3284,8 +2637,6 @@ }, "node_modules/@fluentui/react-message-bar": { "version": "9.4.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-message-bar/-/react-message-bar-9.4.7.tgz", - "integrity": "sha512-9XevlyC5Kr7oVBMo8Dd9ddw8Fmgq/yLN19zz+jyHzPGZMWU+BC40LM/w8l11WdgqN6ij5LZewq9pElMRMJIKkw==", "license": "MIT", "dependencies": { "@fluentui/react-button": "^9.4.6", @@ -3308,8 +2659,6 @@ }, "node_modules/@fluentui/react-motion": { "version": "9.7.2", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion/-/react-motion-9.7.2.tgz", - "integrity": "sha512-xUDkTNPsXKZIlk+Xr+uozdEmKfZ3iNE7dXUAPOgX5rntdMS50JZf4ggyaKdSJsuOVQNqWAoEcCNYLISroDw07g==", "license": "MIT", "dependencies": { "@fluentui/react-shared-contexts": "^9.23.1", @@ -3325,8 +2674,6 @@ }, "node_modules/@fluentui/react-motion-components-preview": { "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-motion-components-preview/-/react-motion-components-preview-0.4.9.tgz", - "integrity": "sha512-sMtCqgmPHclfo6EqeIZmtXqJt+1fJn0Bo7ORsayXRJvjrmf8buDFnCJCjzYPNUR3npy9GFedMqmIkC6ovKkV0w==", "license": "MIT", "dependencies": { "@fluentui/react-motion": "*", @@ -3341,8 +2688,6 @@ }, "node_modules/@fluentui/react-overflow": { "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-overflow/-/react-overflow-9.3.6.tgz", - "integrity": "sha512-yyYX+6jLDyWwZg2G3r4gTxziaT70U9pdRUO1oEVE6Sv1xvMsQGfRQth4khl6OihB1fAFv4mAyx7NTX94D8RYhw==", "license": "MIT", "dependencies": { "@fluentui/priority-overflow": "^9.1.15", @@ -3361,8 +2706,6 @@ }, "node_modules/@fluentui/react-persona": { "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-persona/-/react-persona-9.3.6.tgz", - "integrity": "sha512-EJZk6ZANrWoZ+lGvjW+xXuj5AGu5uNT6LiBo1H3SM6ug/eldz32Pa+UXYPU6sVEW0T8+wUCvPZmhgMnahELSew==", "license": "MIT", "dependencies": { "@fluentui/react-avatar": "^9.7.6", @@ -3383,8 +2726,6 @@ }, "node_modules/@fluentui/react-popover": { "version": "9.10.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-popover/-/react-popover-9.10.6.tgz", - "integrity": "sha512-ddYAbytBGukB2EgcjcMV7q7A8Yh6tmWk8Eg9m1O0rAnB/8xlkuG8BLAN98S4kAGsmrxX2GMb1R3NBBFr+yMdGA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3409,8 +2750,6 @@ }, "node_modules/@fluentui/react-portal": { "version": "9.5.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal/-/react-portal-9.5.6.tgz", - "integrity": "sha512-mAZ5sVf+2TiG5BKOo7Vv88+UeBZEeVGnTZcI6U2iggB7LLzPQdl3Bw+w8QUMBO9PHS/QtzliTqeGpt2QbtMyxw==", "license": "MIT", "dependencies": { "@fluentui/react-shared-contexts": "^9.23.1", @@ -3429,8 +2768,6 @@ }, "node_modules/@fluentui/react-positioning": { "version": "9.16.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-positioning/-/react-positioning-9.16.7.tgz", - "integrity": "sha512-31i2VdDegR5NsHiQxPP7pWQz4u8lkQq9T1rUFHUUtT7OLr3vOcKf0dGWIeMfZ3LzIv+aCX/P3d2bwEiydCeXuA==", "license": "MIT", "dependencies": { "@floating-ui/devtools": "0.2.1", @@ -3450,8 +2787,6 @@ }, "node_modules/@fluentui/react-progress": { "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-progress/-/react-progress-9.2.6.tgz", - "integrity": "sha512-I3zTci64PskUGMS/2tnR3nw5hKsBKu5S7PEiCySUoy+fGSFLKGWaUC0G68EdmFCIwa4AIHG66dUyyTfr/Hjfzg==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3471,8 +2806,6 @@ }, "node_modules/@fluentui/react-provider": { "version": "9.20.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-provider/-/react-provider-9.20.6.tgz", - "integrity": "sha512-yxMWLP1SZMKVLSuE4Z4617DpbzcvItjOvQl/MOiaQHdC6zfq6X+1Ud4thH49o42KIUoIeWsCBSsEyaDAdYBUvg==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", @@ -3494,8 +2827,6 @@ }, "node_modules/@fluentui/react-radio": { "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-radio/-/react-radio-9.3.6.tgz", - "integrity": "sha512-cOZzd8lN1NCVwKnkepTi9B58mEJdds2wJH8veqLv9cbNceD4Bju53xTr2UG9nIXugwdV85tptYU/o0a4oakIRA==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3517,8 +2848,6 @@ }, "node_modules/@fluentui/react-rating": { "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-rating/-/react-rating-9.1.6.tgz", - "integrity": "sha512-uFyp+/iY9Y4ORdtljYBRDfDBZL/wdCmEHwFyNFXKSdFPePeZhkCaKZq7RH+6KCGHY4KTFqDer4IaBgxBaC2oHg==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", @@ -3539,8 +2868,6 @@ }, "node_modules/@fluentui/react-search": { "version": "9.1.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-search/-/react-search-9.1.6.tgz", - "integrity": "sha512-3iu+axBpXuSg2wywOVj9mCqwWEiAtIseLQVFTvY8/q93/fXkHWwXEV1pgfTzPlXNWy19CLV+cuXF0v4D2+JmDA==", "license": "MIT", "dependencies": { "@fluentui/react-icons": "^2.0.245", @@ -3561,8 +2888,6 @@ }, "node_modules/@fluentui/react-select": { "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-select/-/react-select-9.2.6.tgz", - "integrity": "sha512-Yeb/EGOhNrCAseTj6eBgJ0QtWiyibloXepYbyZ3QryXhPeZBLR32yhKVvzGB+ScB4hdY45k/Tam8BdfofstAqw==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3583,8 +2908,6 @@ }, "node_modules/@fluentui/react-shared-contexts": { "version": "9.23.1", - "resolved": "https://registry.npmjs.org/@fluentui/react-shared-contexts/-/react-shared-contexts-9.23.1.tgz", - "integrity": "sha512-mP+7talxLz7n0G36o7Asdvst+JPzUbqbnoMKUWRVB5YwzlOXumEgaQDgL1BkRUJYaDGOjIiSTUjHOEkBt7iSdg==", "license": "MIT", "dependencies": { "@fluentui/react-theme": "^9.1.24", @@ -3597,8 +2920,6 @@ }, "node_modules/@fluentui/react-skeleton": { "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-skeleton/-/react-skeleton-9.2.6.tgz", - "integrity": "sha512-qAb0Td07EqCmyJAK53TYDfWs3NWedqAC7YRt2RVfhaQobI60+etMkXhGDwGDZwryQIFMYlNm6mSV4M5qkC4gCA==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3618,8 +2939,6 @@ }, "node_modules/@fluentui/react-slider": { "version": "9.3.7", - "resolved": "https://registry.npmjs.org/@fluentui/react-slider/-/react-slider-9.3.7.tgz", - "integrity": "sha512-PY4Z9KujrxyRZaLgdY47BlGj3LCmIiCRJE/96DSDz7iPbwfVluH0HJbBsw+MfW70c0CwyPD5VSHtPIi0pnGnKw==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3640,8 +2959,6 @@ }, "node_modules/@fluentui/react-spinbutton": { "version": "9.3.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinbutton/-/react-spinbutton-9.3.6.tgz", - "integrity": "sha512-XVK1AOjKS47MBEKDDKzgePc3DfIr2f1LI+OgmbcAlhBUgyy2FGeixqdAvbJTnRehO6kRRzFjSmMLnb6c6m/W/w==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3663,8 +2980,6 @@ }, "node_modules/@fluentui/react-spinner": { "version": "9.5.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-spinner/-/react-spinner-9.5.11.tgz", - "integrity": "sha512-q0mJLG7LfWSRqa2fO+Qvxw/noZWjk3HM4wurbddTOClezTcBlMXlYlad7rueu9TpzM5caGsWcMF791/gNYLHmQ==", "license": "MIT", "dependencies": { "@fluentui/react-jsx-runtime": "^9.0.54", @@ -3684,8 +2999,6 @@ }, "node_modules/@fluentui/react-swatch-picker": { "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-swatch-picker/-/react-swatch-picker-9.2.6.tgz", - "integrity": "sha512-s9rGkiONRxc8lmc19vbKgrkGtFzKCRv1+Cov5esIG/uJnvmTctzOLjgFj+NeWehvQgrtv8t7Bs7AszlQzfEP5A==", "license": "MIT", "dependencies": { "@fluentui/react-context-selector": "^9.1.76", @@ -3708,8 +3021,6 @@ }, "node_modules/@fluentui/react-switch": { "version": "9.2.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-switch/-/react-switch-9.2.6.tgz", - "integrity": "sha512-stFoqh/ahYmY3LPVIi3voGMPm/wcMMEepkWL8ZLYU5ZKP/knJ2Yy5peW1uVo+5d6PbLUvan9tsSB53IN/2utpA==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3732,8 +3043,6 @@ }, "node_modules/@fluentui/react-table": { "version": "9.16.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-table/-/react-table-9.16.6.tgz", - "integrity": "sha512-u/skqMkdw16Lnje4CevcU1xoSspwTWRLoHXvIiWQyjSkd/mHkspflNJy/wK2aoEO5F7pPak0u72IBxMg+0KIvQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3760,8 +3069,6 @@ }, "node_modules/@fluentui/react-tabs": { "version": "9.7.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabs/-/react-tabs-9.7.6.tgz", - "integrity": "sha512-N8wey1p/bGnHNZd8L/AVU7GOiI3bodbAlL9x9L8grncPMX/WWnwTGMui7A3Ge3u2IQ3rR8XEXz/dVxFpTdv+dg==", "license": "MIT", "dependencies": { "@fluentui/react-context-selector": "^9.1.76", @@ -3782,8 +3089,6 @@ }, "node_modules/@fluentui/react-tabster": { "version": "9.24.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-tabster/-/react-tabster-9.24.6.tgz", - "integrity": "sha512-d0i4Yey8UE+zf+dM/wYtblRwRhxuE9uWdwsxWD5tdvDY3KZxIa9NsNW7xBRA1Az5dhvWw83fJJBd88DosX2sYw==", "license": "MIT", "dependencies": { "@fluentui/react-shared-contexts": "^9.23.1", @@ -3803,8 +3108,6 @@ }, "node_modules/@fluentui/react-tag-picker": { "version": "9.5.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-tag-picker/-/react-tag-picker-9.5.6.tgz", - "integrity": "sha512-DO65MbrWXz7YFc44TSCLGaowtnnje6UMqczCYrQVwzmQlxf00RqgbB3CVjKvW0Z3r89aNLtX9b+mYOQL4ForVg==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3833,8 +3136,6 @@ }, "node_modules/@fluentui/react-tags": { "version": "9.5.4", - "resolved": "https://registry.npmjs.org/@fluentui/react-tags/-/react-tags-9.5.4.tgz", - "integrity": "sha512-xmrhhmNa/hwW4p6gTjsFbctcohsiBJS96SfA/cQQ/pRpNKpjwiAZvppF3R4dBYo1Apnt9VCdAmEYhu7qmjq69A==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3858,8 +3159,6 @@ }, "node_modules/@fluentui/react-teaching-popover": { "version": "9.4.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-teaching-popover/-/react-teaching-popover-9.4.5.tgz", - "integrity": "sha512-axKj4EQuoDsGSK0sEdOAEuwg3ew7Maxu4xKF2Z2jOOf0J7+6lKiZilTzt3gf5XLHUzFMU2bTM7VVAN8O8Et04A==", "license": "MIT", "dependencies": { "@fluentui/react-aria": "^9.14.6", @@ -3885,8 +3184,6 @@ }, "node_modules/@fluentui/react-text": { "version": "9.4.36", - "resolved": "https://registry.npmjs.org/@fluentui/react-text/-/react-text-9.4.36.tgz", - "integrity": "sha512-oLSGz6uksooCQrc+FXvWwAZCP+ucn2h12vZFyWSAOVODDtQMjtycol03p408BEHnPBQbrYaQCFpd3Id5eLuxBg==", "license": "MIT", "dependencies": { "@fluentui/react-jsx-runtime": "^9.0.54", @@ -3905,8 +3202,6 @@ }, "node_modules/@fluentui/react-textarea": { "version": "9.4.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-textarea/-/react-textarea-9.4.6.tgz", - "integrity": "sha512-zdpeCSnVJihbPXHeAYHa1MiO7dJba3Ugtyu7TqJkmiy0Lr5OfeTkX2nLchOPKiEDjQFfSviqDNYZERwO2NGD1g==", "license": "MIT", "dependencies": { "@fluentui/react-field": "^9.2.6", @@ -3926,8 +3221,6 @@ }, "node_modules/@fluentui/react-theme": { "version": "9.1.24", - "resolved": "https://registry.npmjs.org/@fluentui/react-theme/-/react-theme-9.1.24.tgz", - "integrity": "sha512-OhVKYD7CMYHxzJEn4PtIszledj8hbQJNWBMfIZsp4Sytdp9vCi0txIQUx4BhS1WqtQPhNGCF16eW9Q3NRrnIrQ==", "license": "MIT", "dependencies": { "@fluentui/tokens": "1.0.0-alpha.21", @@ -3936,8 +3229,6 @@ }, "node_modules/@fluentui/react-toast": { "version": "9.4.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-toast/-/react-toast-9.4.8.tgz", - "integrity": "sha512-1welldVf/M/c7msCwB8a0yFgKjIF/aUxAgjTHza9jEmxBl45oCzPZY7PVApCY2sSx+iRn8XjSKRkYSPgHUYzKA==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -3963,8 +3254,6 @@ }, "node_modules/@fluentui/react-toolbar": { "version": "9.4.5", - "resolved": "https://registry.npmjs.org/@fluentui/react-toolbar/-/react-toolbar-9.4.5.tgz", - "integrity": "sha512-/Za5QHVqcF1bLW7FIRebl17TI+MCdoVqvHoaE7xodRmAA0a5MWcs3aqtumaeQjZBnGh9HsFYmxTKdh0KEu4LVg==", "license": "MIT", "dependencies": { "@fluentui/react-button": "^9.4.6", @@ -3988,8 +3277,6 @@ }, "node_modules/@fluentui/react-tooltip": { "version": "9.6.6", - "resolved": "https://registry.npmjs.org/@fluentui/react-tooltip/-/react-tooltip-9.6.6.tgz", - "integrity": "sha512-4EHxH5CvzPQjOjl9opldAhSAVSOoUo4ei412RoCRASzoaVBJwQ81r2MaVlf9P84G6WOUUXttRbUQ+0jWV5WoKg==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -4012,8 +3299,6 @@ }, "node_modules/@fluentui/react-tree": { "version": "9.10.9", - "resolved": "https://registry.npmjs.org/@fluentui/react-tree/-/react-tree-9.10.9.tgz", - "integrity": "sha512-Pj/eSXVVw3kGae7Jl3ZBaRqjSOm9JytzgA13eYdHpx58YpqGsYOU6G5CFwx28pTQKeIZIfsIgTDPhD+S5LcVOQ==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -4043,8 +3328,6 @@ }, "node_modules/@fluentui/react-utilities": { "version": "9.19.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-utilities/-/react-utilities-9.19.0.tgz", - "integrity": "sha512-66Kdpr4xZsov6KSqbPDmKR5CB96RUPZuWihMC3RYHj9uH+oxd81k2Jyrb6rM058xjVKDFSFVLUZlsp1Mgts38w==", "license": "MIT", "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", @@ -4058,8 +3341,6 @@ }, "node_modules/@fluentui/react-virtualizer": { "version": "9.0.0-alpha.96", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.96.tgz", - "integrity": "sha512-0o9RSTAAIoJ4xdM2g8hF5u98Up0OHRknRhMolZHZDoqXEvhJ5GroGtp+NPfU7LxU+dxHrZLx9gQ6wVWe/35ZzQ==", "license": "MIT", "dependencies": { "@fluentui/react-jsx-runtime": "^9.0.54", @@ -4077,8 +3358,6 @@ }, "node_modules/@fluentui/tokens": { "version": "1.0.0-alpha.21", - "resolved": "https://registry.npmjs.org/@fluentui/tokens/-/tokens-1.0.0-alpha.21.tgz", - "integrity": "sha512-xQ1T56sNgDFGl+kJdIwhz67mHng8vcwO7Dvx5Uja4t+NRULQBgMcJ4reUo4FGF3TjufHj08pP0/OnKQgnOaSVg==", "license": "MIT", "dependencies": { "@swc/helpers": "^0.5.1" @@ -4086,15 +3365,11 @@ }, "node_modules/@glideapps/ts-necessities": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.4.0.tgz", - "integrity": "sha512-mDC+qosuNa4lxR3ioMBb6CD0XLRsQBplU+zRPUYiMLXKeVPZ6UYphdNG/EGReig0YyfnVlBKZEXl1wzTotYmPA==", "dev": true, "license": "MIT" }, "node_modules/@griffel/core": { "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@griffel/core/-/core-1.19.2.tgz", - "integrity": "sha512-WkB/QQkjy9dE4vrNYGhQvRRUHFkYVOuaznVOMNTDT4pS9aTJ9XPrMTXXlkpcwaf0D3vNKoerj4zAwnU2lBzbOg==", "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.0", @@ -4107,8 +3382,6 @@ }, "node_modules/@griffel/react": { "version": "1.5.30", - "resolved": "https://registry.npmjs.org/@griffel/react/-/react-1.5.30.tgz", - "integrity": "sha512-1q4ojbEVFY5YA0j1NamP0WWF4BKh+GHsVugltDYeEgEaVbH3odJ7tJabuhQgY+7Nhka0pyEFWSiHJev0K3FSew==", "license": "MIT", "dependencies": { "@griffel/core": "^1.19.2", @@ -4120,8 +3393,6 @@ }, "node_modules/@griffel/style-types": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@griffel/style-types/-/style-types-1.3.0.tgz", - "integrity": "sha512-bHwD3sUE84Xwv4dH011gOKe1jul77M1S6ZFN9Tnq8pvZ48UMdY//vtES6fv7GRS5wXYT4iqxQPBluAiYAfkpmw==", "license": "MIT", "dependencies": { "csstype": "^3.1.3" @@ -4139,22 +3410,8 @@ "hono": "^4" } }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4163,8 +3420,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4177,8 +3432,6 @@ }, "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4191,8 +3444,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4205,8 +3456,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4219,8 +3468,6 @@ }, "node_modules/@inquirer/external-editor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4241,15 +3488,11 @@ }, "node_modules/@inquirer/external-editor/node_modules/chardet": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", "dev": true, "license": "MIT" }, "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4265,8 +3508,6 @@ }, "node_modules/@inquirer/figures": { "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", "dev": true, "license": "MIT", "engines": { @@ -4275,8 +3516,6 @@ }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", "engines": { @@ -4285,8 +3524,6 @@ }, "node_modules/@isaacs/brace-expansion": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "dev": true, "license": "MIT", "dependencies": { @@ -4298,8 +3535,6 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -4316,8 +3551,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -4329,8 +3562,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -4342,15 +3573,11 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4367,8 +3594,6 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4383,8 +3608,6 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4401,8 +3624,6 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4418,8 +3639,6 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -4428,8 +3647,6 @@ }, "node_modules/@jest/console": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { @@ -4446,8 +3663,6 @@ }, "node_modules/@jest/core": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { @@ -4494,8 +3709,6 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { @@ -4510,8 +3723,6 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4524,8 +3735,6 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -4537,8 +3746,6 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4555,8 +3762,6 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4571,8 +3776,6 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { @@ -4615,8 +3818,6 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -4628,8 +3829,6 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { @@ -4643,8 +3842,6 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { @@ -4659,8 +3856,6 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { @@ -4675,8 +3870,6 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -4702,8 +3895,6 @@ }, "node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -4720,8 +3911,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -4731,8 +3920,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4742,8 +3929,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -4752,15 +3937,11 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -4770,14 +3951,10 @@ }, "node_modules/@lezer/common": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", "license": "MIT" }, "node_modules/@lezer/highlight": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -4785,8 +3962,6 @@ }, "node_modules/@lezer/javascript": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz", - "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -4796,8 +3971,6 @@ }, "node_modules/@lezer/json": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", - "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -4807,8 +3980,6 @@ }, "node_modules/@lezer/lr": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -4888,14 +4059,10 @@ }, "node_modules/@marijn/find-cluster-break": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "license": "MIT" }, "node_modules/@mark.probst/typescript-json-schema": { "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@mark.probst/typescript-json-schema/-/typescript-json-schema-0.55.0.tgz", - "integrity": "sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4914,15 +4081,11 @@ }, "node_modules/@mark.probst/typescript-json-schema/node_modules/@types/node": { "version": "16.18.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", "dev": true, "license": "MIT" }, "node_modules/@mark.probst/typescript-json-schema/node_modules/typescript": { "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4935,8 +4098,6 @@ }, "node_modules/@microsoft/teams-js": { "version": "2.36.0", - "resolved": "https://registry.npmjs.org/@microsoft/teams-js/-/teams-js-2.36.0.tgz", - "integrity": "sha512-Ufib7QLYxyYS1BB9Za3Mh71+v34b9LOWGjaUlILwjEY9ux5Pez1zmgE1OMobnqUaMf53E8H4SoOnWQOVenOdHQ==", "license": "MIT", "peer": true, "dependencies": { @@ -5022,8 +4183,6 @@ }, "node_modules/@modelcontextprotocol/inspector": { "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector/-/inspector-0.16.8.tgz", - "integrity": "sha512-7kk6uOGY9ySgCFsRuRplWzvjiEwulG876pfnjQxqaBJAcUlp3N1yrOt7YQMBZsxvop+RGw50IehiPuGs+7oh+w==", "dev": true, "license": "MIT", "workspaces": [ @@ -5053,8 +4212,6 @@ }, "node_modules/@modelcontextprotocol/inspector-cli": { "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-cli/-/inspector-cli-0.16.8.tgz", - "integrity": "sha512-u8x8Dbb8Dos34M7N8p4e4AF++Bi1D+lq+dkRCvLi5Qub/dI75Z7YTIXBezA4LbIISly+Ecn05fdofzZwqyOvpg==", "dev": true, "license": "MIT", "dependencies": { @@ -5068,8 +4225,6 @@ }, "node_modules/@modelcontextprotocol/inspector-cli/node_modules/commander": { "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { @@ -5078,8 +4233,6 @@ }, "node_modules/@modelcontextprotocol/inspector-client": { "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-client/-/inspector-client-0.16.8.tgz", - "integrity": "sha512-4sTk/jUnQ1lDv9kbx1nN45SsoApDxW8hjKLKcHnHh9nfRVEN9SW+ylUjNvVCDP74xSNpD8v5p6NJyVWtZYfPWA==", "dev": true, "license": "MIT", "dependencies": { @@ -5115,8 +4268,6 @@ }, "node_modules/@modelcontextprotocol/inspector-client/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -5132,15 +4283,11 @@ }, "node_modules/@modelcontextprotocol/inspector-client/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/@modelcontextprotocol/inspector-client/node_modules/pkce-challenge": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-4.1.0.tgz", - "integrity": "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==", "dev": true, "license": "MIT", "engines": { @@ -5149,8 +4296,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server": { "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/inspector-server/-/inspector-server-0.16.8.tgz", - "integrity": "sha512-plv0SiPgQAT0/LjC0MmGsoo/sdpS6V4TpOUAxO4J3DnvnLLaInnNh9hiU1SlGgCjsRv0nN9TvX9pWRqVnZH9kw==", "dev": true, "license": "MIT", "dependencies": { @@ -5168,8 +4313,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "license": "MIT", "dependencies": { @@ -5182,8 +4325,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/body-parser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "dev": true, "license": "MIT", "dependencies": { @@ -5207,8 +4348,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "dev": true, "license": "MIT", "engines": { @@ -5221,8 +4360,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, "license": "MIT", "engines": { @@ -5231,8 +4368,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", "dependencies": { @@ -5275,8 +4410,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, "license": "MIT", "dependencies": { @@ -5297,8 +4430,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, "license": "MIT", "engines": { @@ -5307,8 +4438,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/iconv-lite": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5324,8 +4453,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true, "license": "MIT", "engines": { @@ -5334,8 +4461,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, "license": "MIT", "engines": { @@ -5347,8 +4472,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -5357,8 +4480,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", "dependencies": { @@ -5374,8 +4495,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "license": "MIT", "engines": { @@ -5384,8 +4503,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/send": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, "license": "MIT", "dependencies": { @@ -5407,8 +4524,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5423,8 +4538,6 @@ }, "node_modules/@modelcontextprotocol/inspector-server/node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, "license": "MIT", "dependencies": { @@ -5438,8 +4551,6 @@ }, "node_modules/@modelcontextprotocol/inspector/node_modules/data-uri-to-buffer": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "dev": true, "license": "MIT", "engines": { @@ -5448,8 +4559,6 @@ }, "node_modules/@modelcontextprotocol/inspector/node_modules/node-fetch": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, "license": "MIT", "dependencies": { @@ -5466,12 +4575,10 @@ } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.3.tgz", - "integrity": "sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==", + "version": "1.25.2", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -5483,7 +4590,6 @@ "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", - "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", @@ -5507,8 +4613,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { "mime-types": "^3.0.0", @@ -5520,8 +4624,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -5544,8 +4646,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", "engines": { "node": ">=18" @@ -5557,8 +4657,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { "node": ">=6.6.0" @@ -5566,8 +4664,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/express": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", @@ -5609,8 +4705,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -5630,8 +4724,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5639,8 +4731,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5655,8 +4745,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/jose": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -5664,8 +4752,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -5673,8 +4759,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { "node": ">=18" @@ -5685,8 +4769,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5694,8 +4776,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -5710,8 +4790,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -5719,8 +4797,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/send": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -5741,8 +4817,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -5756,8 +4830,6 @@ }, "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -5768,10 +4840,158 @@ "node": ">= 0.6" } }, + "node_modules/@next/env": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", + "license": "MIT" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "dev": true, "license": "MIT", "engines": { @@ -5783,8 +5003,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -5797,8 +5015,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -5807,8 +5023,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -5821,8 +5035,6 @@ }, "node_modules/@opentelemetry/api": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", "engines": { "node": ">=8.0.0" @@ -5830,8 +5042,6 @@ }, "node_modules/@paralleldrive/cuid2": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", "dev": true, "license": "MIT", "dependencies": { @@ -5840,8 +5050,6 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -5851,22 +5059,16 @@ }, "node_modules/@radix-ui/number": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", "dev": true, "license": "MIT" }, "node_modules/@radix-ui/primitive": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", "dev": true, "license": "MIT" }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", "dev": true, "license": "MIT", "dependencies": { @@ -5889,8 +5091,6 @@ }, "node_modules/@radix-ui/react-checkbox": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", "dev": true, "license": "MIT", "dependencies": { @@ -5920,8 +5120,6 @@ }, "node_modules/@radix-ui/react-collection": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", "dev": true, "license": "MIT", "dependencies": { @@ -5947,8 +5145,6 @@ }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5963,8 +5159,6 @@ }, "node_modules/@radix-ui/react-context": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5979,8 +5173,6 @@ }, "node_modules/@radix-ui/react-dialog": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", "dev": true, "license": "MIT", "dependencies": { @@ -6016,8 +5208,6 @@ }, "node_modules/@radix-ui/react-direction": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6032,8 +5222,6 @@ }, "node_modules/@radix-ui/react-dismissable-layer": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -6060,8 +5248,6 @@ }, "node_modules/@radix-ui/react-focus-guards": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6076,8 +5262,6 @@ }, "node_modules/@radix-ui/react-focus-scope": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", "dev": true, "license": "MIT", "dependencies": { @@ -6102,8 +5286,6 @@ }, "node_modules/@radix-ui/react-icons": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.2.tgz", - "integrity": "sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6112,8 +5294,6 @@ }, "node_modules/@radix-ui/react-id": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", "dev": true, "license": "MIT", "dependencies": { @@ -6131,8 +5311,6 @@ }, "node_modules/@radix-ui/react-label": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6155,8 +5333,6 @@ }, "node_modules/@radix-ui/react-popover": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", "dev": true, "license": "MIT", "dependencies": { @@ -6193,8 +5369,6 @@ }, "node_modules/@radix-ui/react-popper": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", "dev": true, "license": "MIT", "dependencies": { @@ -6226,8 +5400,6 @@ }, "node_modules/@radix-ui/react-portal": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6251,8 +5423,6 @@ }, "node_modules/@radix-ui/react-presence": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6276,8 +5446,6 @@ }, "node_modules/@radix-ui/react-primitive": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6300,8 +5468,6 @@ }, "node_modules/@radix-ui/react-roving-focus": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", "dev": true, "license": "MIT", "dependencies": { @@ -6332,8 +5498,6 @@ }, "node_modules/@radix-ui/react-select": { "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6376,8 +5540,6 @@ }, "node_modules/@radix-ui/react-slot": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "dev": true, "license": "MIT", "dependencies": { @@ -6395,8 +5557,6 @@ }, "node_modules/@radix-ui/react-switch": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6425,8 +5585,6 @@ }, "node_modules/@radix-ui/react-tabs": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", "dev": true, "license": "MIT", "dependencies": { @@ -6456,8 +5614,6 @@ }, "node_modules/@radix-ui/react-toast": { "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", "dev": true, "license": "MIT", "dependencies": { @@ -6491,8 +5647,6 @@ }, "node_modules/@radix-ui/react-tooltip": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", "dev": true, "license": "MIT", "dependencies": { @@ -6526,8 +5680,6 @@ }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6542,8 +5694,6 @@ }, "node_modules/@radix-ui/react-use-controllable-state": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", "dev": true, "license": "MIT", "dependencies": { @@ -6562,8 +5712,6 @@ }, "node_modules/@radix-ui/react-use-effect-event": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", "dev": true, "license": "MIT", "dependencies": { @@ -6581,8 +5729,6 @@ }, "node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", "dev": true, "license": "MIT", "dependencies": { @@ -6600,8 +5746,6 @@ }, "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6616,8 +5760,6 @@ }, "node_modules/@radix-ui/react-use-previous": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -6632,8 +5774,6 @@ }, "node_modules/@radix-ui/react-use-rect": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", "dev": true, "license": "MIT", "dependencies": { @@ -6651,8 +5791,6 @@ }, "node_modules/@radix-ui/react-use-size": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6670,8 +5808,6 @@ }, "node_modules/@radix-ui/react-visually-hidden": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", "dev": true, "license": "MIT", "dependencies": { @@ -6694,15 +5830,11 @@ }, "node_modules/@radix-ui/rect": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", "dev": true, "license": "MIT" }, "node_modules/@redocly/ajv": { "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -6717,14 +5849,10 @@ }, "node_modules/@redocly/config": { "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", - "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", "license": "MIT" }, "node_modules/@redocly/openapi-core": { "version": "1.34.2", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.2.tgz", - "integrity": "sha512-glfkQFJizLdq2fBkNvc2FJW0sxDb5exd0wIXhFk+WHaFLMREBC3CxRo2Zq7uJIdfV9U3YTceMbXJklpDfmmwFQ==", "license": "MIT", "dependencies": { "@redocly/ajv": "^8.11.2", @@ -6744,14 +5872,10 @@ }, "node_modules/@redocly/openapi-core/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/@redocly/openapi-core/node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -6762,8 +5886,6 @@ }, "node_modules/@redocly/openapi-core/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -6774,15 +5896,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", "dev": true, "license": "MIT" }, "node_modules/@rollup/plugin-node-resolve": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", - "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", "dev": true, "license": "MIT", "dependencies": { @@ -6806,8 +5924,6 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6827,38 +5943,8 @@ } } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", - "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", - "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", - "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", "cpu": [ "arm64" ], @@ -6869,359 +5955,101 @@ "darwin" ] }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", - "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", - "cpu": [ - "x64" - ], + "node_modules/@rtsao/scc": { + "version": "1.1.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", - "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", - "cpu": [ - "arm64" - ], + "node_modules/@sinclair/typebox": { + "version": "0.27.8", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "license": "MIT" }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", - "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", - "cpu": [ - "x64" - ], + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", - "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", - "cpu": [ - "arm" - ], + "node_modules/@sinonjs/commons": { + "version": "3.0.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", - "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", - "cpu": [ - "arm" - ], + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", - "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", - "cpu": [ - "arm64" - ], + "node_modules/@stylistic/eslint-plugin": { + "version": "4.2.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@typescript-eslint/utils": "^8.23.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", - "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", - "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", - "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", - "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", - "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", - "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", - "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", - "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", - "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", - "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", - "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", - "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^8.23.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=9.0.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "node_modules/@swc/helpers": { + "version": "0.5.17", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node10": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@turbo/gen": { "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@turbo/gen/-/gen-2.5.7.tgz", - "integrity": "sha512-DA94TPpF0bB5jFmzBBuVLvcL4qlBVKrCfjrE1sxZdf8xlH84U0K88tpGyuTdQIwpBRNg7VWBcVHqvoEkHHlSQw==", "dev": true, "license": "MIT", "dependencies": { @@ -7243,8 +6071,6 @@ }, "node_modules/@turbo/gen/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7258,8 +6084,6 @@ }, "node_modules/@turbo/gen/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7271,15 +6095,11 @@ }, "node_modules/@turbo/gen/node_modules/picocolors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true, "license": "ISC" }, "node_modules/@turbo/gen/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -7288,8 +6108,6 @@ }, "node_modules/@turbo/workspaces": { "version": "2.5.7", - "resolved": "https://registry.npmjs.org/@turbo/workspaces/-/workspaces-2.5.7.tgz", - "integrity": "sha512-H3VsFpo7sU+SZ83LffnhJEczePsggxXskVmdMpn4H2HORKYwk672+E0cpSstwbXtNxcMH/nmfAjHOI8WOAZl1A==", "dev": true, "license": "MIT", "dependencies": { @@ -7311,15 +6129,11 @@ }, "node_modules/@turbo/workspaces/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/@turbo/workspaces/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7333,8 +6147,6 @@ }, "node_modules/@turbo/workspaces/node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -7346,8 +6158,6 @@ }, "node_modules/@turbo/workspaces/node_modules/jsonfile": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, "license": "MIT", "dependencies": { @@ -7359,15 +6169,11 @@ }, "node_modules/@turbo/workspaces/node_modules/picocolors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true, "license": "ISC" }, "node_modules/@turbo/workspaces/node_modules/semver": { "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", "bin": { @@ -7379,8 +6185,6 @@ }, "node_modules/@turbo/workspaces/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -7389,8 +6193,6 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -7403,8 +6205,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { @@ -7413,8 +6213,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -7424,8 +6222,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { @@ -7434,8 +6230,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -7444,8 +6238,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7453,15 +6245,11 @@ }, "node_modules/@types/cookiejar": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/cors": { "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "license": "MIT", "dependencies": { @@ -7470,8 +6258,6 @@ }, "node_modules/@types/debug": { "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "license": "MIT", "dependencies": { "@types/ms": "*" @@ -7479,14 +6265,10 @@ }, "node_modules/@types/estree": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "license": "MIT", "dependencies": { "@types/estree": "*" @@ -7494,8 +6276,6 @@ }, "node_modules/@types/express": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz", - "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7506,8 +6286,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "license": "MIT", "dependencies": { @@ -7519,8 +6297,6 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7529,8 +6305,6 @@ }, "node_modules/@types/hast": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -7538,14 +6312,10 @@ }, "node_modules/@types/http-errors": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, "node_modules/@types/inquirer": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz", - "integrity": "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==", "dev": true, "license": "MIT", "dependencies": { @@ -7555,15 +6325,11 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -7572,8 +6338,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7582,8 +6346,6 @@ }, "node_modules/@types/jest": { "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7593,22 +6355,16 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@types/jsonwebtoken": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", - "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", "license": "MIT", "dependencies": { "@types/ms": "*", @@ -7617,15 +6373,11 @@ }, "node_modules/@types/lodash": { "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", "dev": true, "license": "MIT" }, "node_modules/@types/lodash.camelcase": { "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@types/lodash.camelcase/-/lodash.camelcase-4.3.9.tgz", - "integrity": "sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -7634,8 +6386,6 @@ }, "node_modules/@types/mdast": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -7643,27 +6393,19 @@ }, "node_modules/@types/methods": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", "dev": true, "license": "MIT" }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/node": { "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -7671,8 +6413,6 @@ }, "node_modules/@types/node-fetch": { "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -7681,26 +6421,18 @@ }, "node_modules/@types/prop-types": { "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -7709,8 +6441,6 @@ }, "node_modules/@types/react-dom": { "version": "18.3.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", - "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" @@ -7718,15 +6448,11 @@ }, "node_modules/@types/resolve": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -7735,8 +6461,6 @@ }, "node_modules/@types/serve-static": { "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", @@ -7746,15 +6470,11 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, "node_modules/@types/superagent": { "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7766,8 +6486,6 @@ }, "node_modules/@types/supertest": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", "dev": true, "license": "MIT", "dependencies": { @@ -7777,8 +6495,6 @@ }, "node_modules/@types/through": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7787,15 +6503,11 @@ }, "node_modules/@types/tinycolor2": { "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", - "integrity": "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==", "dev": true, "license": "MIT" }, "node_modules/@types/tunnel": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", - "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7803,14 +6515,10 @@ }, "node_modules/@types/unist": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, "node_modules/@types/ws": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7818,8 +6526,6 @@ }, "node_modules/@types/yargs": { "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -7828,15 +6534,11 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", - "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7865,8 +6567,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", - "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7890,8 +6590,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", - "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", "dev": true, "license": "MIT", "dependencies": { @@ -7908,8 +6606,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", - "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", "dev": true, "license": "MIT", "dependencies": { @@ -7932,8 +6628,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", - "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", "dev": true, "license": "MIT", "engines": { @@ -7946,8 +6640,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", - "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", "dev": true, "license": "MIT", "dependencies": { @@ -7973,8 +6665,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", - "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7997,8 +6687,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", - "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", "dev": true, "license": "MIT", "dependencies": { @@ -8015,8 +6703,6 @@ }, "node_modules/@uiw/codemirror-theme-abcdef": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-abcdef/-/codemirror-theme-abcdef-4.23.11.tgz", - "integrity": "sha512-+36gOHUdBAzhf3PaAs4vVV1253LFiINBn3K7qEoD4XqTpeHzQEVlokEBksEYsQ0FzanTzDA5iW2yJifCSPG/MQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8027,8 +6713,6 @@ }, "node_modules/@uiw/codemirror-theme-abyss": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-abyss/-/codemirror-theme-abyss-4.23.11.tgz", - "integrity": "sha512-aDH+p2SWG+C3x6IqeHw49cnM92V0VGne4ZKCZG0EdBHCdHFtAym3yLIGuvCJPWiVWfPe5GzXltdPj0KHeWfO3Q==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8039,8 +6723,6 @@ }, "node_modules/@uiw/codemirror-theme-androidstudio": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-androidstudio/-/codemirror-theme-androidstudio-4.23.11.tgz", - "integrity": "sha512-M08kw4jBCWqghqnVXvdI1AwOByJ0XvhhfMvNK5n4Pd57akSvc7W81iO2JNhAdkhWtRA4QLVjAsYM5429xvY1yg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8051,8 +6733,6 @@ }, "node_modules/@uiw/codemirror-theme-andromeda": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-andromeda/-/codemirror-theme-andromeda-4.23.11.tgz", - "integrity": "sha512-OqNtzdF3r/pXk0Bgc03ju4/x5r0a6ARLb5WTGYjptSTOdKXV2j5RYp/z+6XOV7zJiclBgMFoLoe0OfqV3fkuhg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8063,8 +6743,6 @@ }, "node_modules/@uiw/codemirror-theme-atomone": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-atomone/-/codemirror-theme-atomone-4.23.11.tgz", - "integrity": "sha512-l7+Hu4KM5F8byDkHpWHDmqH+yp1bKSvlAOqyeAZ9ivLcb9P6bBmA8cW+J3Koo2D3p9CJt1r/rUoenRec6QdsWg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8075,8 +6753,6 @@ }, "node_modules/@uiw/codemirror-theme-aura": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-aura/-/codemirror-theme-aura-4.23.11.tgz", - "integrity": "sha512-6FjmHsOSL3nRZIajrBuo/+AivJ4EtYL53Ov+nuIZKIKOXSct2WoKCbghLR/BuB/rQ1Nix+zJjnBmmio1a1xWMA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8087,8 +6763,6 @@ }, "node_modules/@uiw/codemirror-theme-basic": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-basic/-/codemirror-theme-basic-4.23.11.tgz", - "integrity": "sha512-7gUyRD94dJFS+axqSuRycStCkJEbjmw1OwZBiP0aly7SpE7kH02EhnHXsLxF2Bn/HTAzWJqUwMzpX5pTz6blfg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8099,8 +6773,6 @@ }, "node_modules/@uiw/codemirror-theme-bbedit": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-bbedit/-/codemirror-theme-bbedit-4.23.11.tgz", - "integrity": "sha512-m5A+BRrlk/JQiNk7MJF0ZbhIeH1RFR/Ds7bcBZvX2aCPGgYoacvydwc5TnWhvfTBPmWvih6BCI5CctbmKg3ESQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8111,8 +6783,6 @@ }, "node_modules/@uiw/codemirror-theme-bespin": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-bespin/-/codemirror-theme-bespin-4.23.11.tgz", - "integrity": "sha512-dUiAlvFWFDTGEo4YXIHpRWuKA4XlHWfJKqDTHb1Pvd9Mv3Vn9zlxqK00dCRtvetjwIAuWzR+6KlOjyyEasFTKw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8123,8 +6793,6 @@ }, "node_modules/@uiw/codemirror-theme-console": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-console/-/codemirror-theme-console-4.23.11.tgz", - "integrity": "sha512-mj+w3m0bcAk/0ScqAWdneenEK175Ids8+yKi39R0ZGYW2N0wBQqLIUClWOPPsl/eZuci9RwXcsV9QynGCGnEsA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8132,8 +6800,6 @@ }, "node_modules/@uiw/codemirror-theme-copilot": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-copilot/-/codemirror-theme-copilot-4.23.11.tgz", - "integrity": "sha512-m6vvsWHbji0s25ly3L35BdjSMys4DL3dzb4wbVtYa7m79heA3h2YNiWFIkOjbyPtoOh4RUGB6tBT8z0J/5PmTA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8144,8 +6810,6 @@ }, "node_modules/@uiw/codemirror-theme-darcula": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-darcula/-/codemirror-theme-darcula-4.23.11.tgz", - "integrity": "sha512-H+vgtteL6CSlcfTd8LOGdthuVS05wLVWQEFxRZrXpnaOxYk4fEkY2XGI6rGX6snnBsKROXm2Kdd/Asxlxbpfgw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8156,8 +6820,6 @@ }, "node_modules/@uiw/codemirror-theme-dracula": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-dracula/-/codemirror-theme-dracula-4.23.11.tgz", - "integrity": "sha512-OdiDo4AN3/1WeJGtQIJEifgxAINR7hzrafy223eh8I5/g0iuRQy8Cd2D9tAEB9qeKWHKJijuPRWpBeSL/ktK3w==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8168,8 +6830,6 @@ }, "node_modules/@uiw/codemirror-theme-duotone": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-duotone/-/codemirror-theme-duotone-4.23.11.tgz", - "integrity": "sha512-pQKxnfwcK/zi+4QxEnwnxk19jRh3e67diORkbdG26feIr+UuaRe3RJnbpDdX2mXoQEtmUpGJsS9IGhGnZop30g==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8180,8 +6840,6 @@ }, "node_modules/@uiw/codemirror-theme-eclipse": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-eclipse/-/codemirror-theme-eclipse-4.23.11.tgz", - "integrity": "sha512-VCOTzuMZfS2oOPcvpYSmGh5mKN+cgUR2yLEo/hTgdysnOgIyVzBiLM4QC5uHG+MuiFLKttWIvTToSNVB+CFccw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8192,8 +6850,6 @@ }, "node_modules/@uiw/codemirror-theme-github": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-github/-/codemirror-theme-github-4.23.11.tgz", - "integrity": "sha512-it/FjMR6OgHlE8dz5R8x+bLpnRcfonNCPFbuaNFr8ouKbdill6djSY5+SsUePHgmmlsX0mi5wTbUAW8U7dVDCQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8204,8 +6860,6 @@ }, "node_modules/@uiw/codemirror-theme-gruvbox-dark": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-gruvbox-dark/-/codemirror-theme-gruvbox-dark-4.23.11.tgz", - "integrity": "sha512-QvK6N5jkzFwoDllCfa0sExWTvLwU77/XyG8JbvDC7BZmkNGWcl5hGU7Cf2QxDrJfbnYAgoJoz3oNp8/YNg5OFg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8216,8 +6870,6 @@ }, "node_modules/@uiw/codemirror-theme-kimbie": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-kimbie/-/codemirror-theme-kimbie-4.23.11.tgz", - "integrity": "sha512-heso7a0YDMbQrof0i2CJblthIVLV4hIfuaNkk/KeTbSmizkQp2Jp2QIJaR1HNSjOCz0r6/j8ThwbVNDb3nv3lg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8228,8 +6880,6 @@ }, "node_modules/@uiw/codemirror-theme-material": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-material/-/codemirror-theme-material-4.23.11.tgz", - "integrity": "sha512-5dF54PiozGFyxNrxJTKtdl0wdqdDeianA5KYW7UQjJndGtmt8eQBJBZ8YvLmHf5z54I42CqbpaWKJtipajDyHg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8240,8 +6890,6 @@ }, "node_modules/@uiw/codemirror-theme-monokai": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-monokai/-/codemirror-theme-monokai-4.23.11.tgz", - "integrity": "sha512-HtxFcsVSG1LEP7t+FlZsM+D5jYG3ylrao8o1+GnzlQvM2l7RMVnRyCcHabvxhGKi2y+FYZ/SMbE5joljo32QyA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8252,8 +6900,6 @@ }, "node_modules/@uiw/codemirror-theme-monokai-dimmed": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-monokai-dimmed/-/codemirror-theme-monokai-dimmed-4.23.11.tgz", - "integrity": "sha512-RG2sysUs0cEe5S1BQthpGn0qwty5mbQVNGVlg+PKcdaPbiMT/TKupC9lTHL/+u9uGhT/MRWno0PCPGvBOJfg3g==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8264,8 +6910,6 @@ }, "node_modules/@uiw/codemirror-theme-noctis-lilac": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-noctis-lilac/-/codemirror-theme-noctis-lilac-4.23.11.tgz", - "integrity": "sha512-cZeKxm53NbrJCKg8w6stmT9CXILWbysDdrUrSqv7enqe60wwvUsqRuMPwkOuLoznLHNfgPrPIZojP06K8hRk1Q==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8276,8 +6920,6 @@ }, "node_modules/@uiw/codemirror-theme-nord": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-nord/-/codemirror-theme-nord-4.23.11.tgz", - "integrity": "sha512-bbeXuRGmj5Jp1p7rSv7fhb5EDc06hmElSHV6BdqKEuIMn9G9b2kMAxyF5guDmlIDgAXaSHTKm9lqj199WuGatA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8288,8 +6930,6 @@ }, "node_modules/@uiw/codemirror-theme-okaidia": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-okaidia/-/codemirror-theme-okaidia-4.23.11.tgz", - "integrity": "sha512-9vRxdGOuc8wzFzEckIVlTaMTFb0MkhLir/dtXTgp/ZYhslPuqkyOK+VWqbLxON1xTvVNpsJd9sVskU2MycI9Hw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8300,8 +6940,6 @@ }, "node_modules/@uiw/codemirror-theme-quietlight": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-quietlight/-/codemirror-theme-quietlight-4.23.11.tgz", - "integrity": "sha512-dvxXUKyh3XFNSnQRwAore524mG98jqXh1XNjnhyUj5QJfN9AoXt1vExlZb0fsxCOoEkCdmjKed7scdmugJADMw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8312,8 +6950,6 @@ }, "node_modules/@uiw/codemirror-theme-red": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-red/-/codemirror-theme-red-4.23.11.tgz", - "integrity": "sha512-8dCMRnU96GNr7vKOIQQB24jyzbYCZOS5YNLem6UzCE1fEXP3fk0ZuGjSQ34WF1pw3KgbiglKSgK4aZEDg2PHYA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8324,8 +6960,6 @@ }, "node_modules/@uiw/codemirror-theme-solarized": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-solarized/-/codemirror-theme-solarized-4.23.11.tgz", - "integrity": "sha512-AKbimVNu3tSqYNmAXYfU6fjmpULg/sRuaMrptLHYp3+sxuE0oMrushKFOGG+Se94Kf+9jS16IXls1fqc3OXaHA==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8336,8 +6970,6 @@ }, "node_modules/@uiw/codemirror-theme-sublime": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-sublime/-/codemirror-theme-sublime-4.23.11.tgz", - "integrity": "sha512-lYv/zqw00eMq1MTk1uIi674+q39mm3Lc8XfLTsnbPNmdcDBdugkDqlgEs4oxgruWFDFkuAE6unbE4gcKMy6QxQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8348,8 +6980,6 @@ }, "node_modules/@uiw/codemirror-theme-tokyo-night": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tokyo-night/-/codemirror-theme-tokyo-night-4.23.11.tgz", - "integrity": "sha512-npnHmOT3TTzUjM+0Q8I2cmZ+cyYoVpetTfBnsoS9/sJrNAlCxXGd6HWpLtOVXBhCRjTRtwP7y207jaIgYM9fAQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8360,8 +6990,6 @@ }, "node_modules/@uiw/codemirror-theme-tokyo-night-day": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tokyo-night-day/-/codemirror-theme-tokyo-night-day-4.23.11.tgz", - "integrity": "sha512-9Jvimv1vSdug3Cq6oOimTVvU/ewwUcrt2c+LX9zif4bSK9BnheU3y0yeQAasbbPZwX5iaPFIbzG1COeFia9oag==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8372,8 +7000,6 @@ }, "node_modules/@uiw/codemirror-theme-tokyo-night-storm": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tokyo-night-storm/-/codemirror-theme-tokyo-night-storm-4.23.11.tgz", - "integrity": "sha512-fMcdk0AbiGDroz5xopZX4LGMTjvlwDfda+t8wDyOG4/b7J+fKDAZ2LjXLIlJnh8AWSyOy31j+CNlscvYH9AbNw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8384,8 +7010,6 @@ }, "node_modules/@uiw/codemirror-theme-tomorrow-night-blue": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tomorrow-night-blue/-/codemirror-theme-tomorrow-night-blue-4.23.11.tgz", - "integrity": "sha512-exN2u5j3ZKxmoA0ntX4B7mGRxAhOCcMufsBYWBWYjgaHt6J0gEFkb9F7Do5Cj69Sg9wQylxu5JKVOA8RjYFLRQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8396,8 +7020,6 @@ }, "node_modules/@uiw/codemirror-theme-vscode": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.23.11.tgz", - "integrity": "sha512-d7NlVntrRG4/2IIs9NMHcTa1d2bEvEg3NP2SKDK4rBZDogpv0+9c6giutx06BySYBLm9M+i3H+sf42Rexy8ncg==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8408,8 +7030,6 @@ }, "node_modules/@uiw/codemirror-theme-white": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-white/-/codemirror-theme-white-4.23.11.tgz", - "integrity": "sha512-In9OQM/MEPrzkymqyK2w0ebpffgjKawVXIiDT2RrB1hw455K3y3geexYsggo9ShjwnqrCaZ3pmQikE13BiDH3Q==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8420,8 +7040,6 @@ }, "node_modules/@uiw/codemirror-theme-xcode": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-xcode/-/codemirror-theme-xcode-4.23.11.tgz", - "integrity": "sha512-mFcPQDR/ZiOeJKrT82mp6Fa30VEypuXxSvU5AxC8worUkqglBOq3kNaT9e53raM6v4SvykqlbozhzmGU2fYXAw==", "license": "MIT", "dependencies": { "@uiw/codemirror-themes": "4.23.11" @@ -8432,8 +7050,6 @@ }, "node_modules/@uiw/codemirror-themes": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.23.11.tgz", - "integrity": "sha512-90joUOau/3E6KNdA5ePr/t8LVBA/426wIsOuwaZohsDM5a5gsYfdMWGYfClnLMkpfHJUDYYMO+b2JPhJf9mzHw==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -8451,8 +7067,6 @@ }, "node_modules/@uiw/codemirror-themes-all": { "version": "4.23.11", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes-all/-/codemirror-themes-all-4.23.11.tgz", - "integrity": "sha512-KmIFryWBkAjavOo0LQ/wt2V+UchDs06WA9tRwMZ7I4Eqi5I/ws5BLyNa6ElEt9cetdvwTtOBCeiGh3o4ig3UhQ==", "license": "MIT", "dependencies": { "@uiw/codemirror-theme-abcdef": "4.23.11", @@ -8498,14 +7112,10 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", "dev": true, "license": "MIT", "dependencies": { @@ -8525,8 +7135,6 @@ }, "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, "license": "MIT", "engines": { @@ -8535,8 +7143,6 @@ }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -8547,8 +7153,6 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -8560,8 +7164,6 @@ }, "node_modules/acorn": { "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -8573,8 +7175,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8583,8 +7183,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { @@ -8596,14 +7194,10 @@ }, "node_modules/adaptivecards": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.3.tgz", - "integrity": "sha512-amQ5OSW3OpIkrxVKLjxVBPk/T49yuOtnqs1z5ZPfZr0+OpTovzmiHbyoAGDIsu5SNYHwOZFp/3LGOnRaALFa/g==", "license": "MIT" }, "node_modules/agent-base": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "license": "MIT", "engines": { "node": ">= 14" @@ -8611,8 +7205,6 @@ }, "node_modules/agentkeepalive": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "license": "MIT", "peer": true, "dependencies": { @@ -8624,8 +7216,6 @@ }, "node_modules/ajv": { "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -8640,8 +7230,6 @@ }, "node_modules/ajv-formats": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -8657,8 +7245,6 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "license": "MIT", "engines": { "node": ">=6" @@ -8666,8 +7252,6 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8682,8 +7266,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -8691,8 +7273,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -8706,15 +7286,11 @@ }, "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -8727,8 +7303,6 @@ }, "node_modules/anymatch/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -8740,15 +7314,11 @@ }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -8757,8 +7327,6 @@ }, "node_modules/aria-hidden": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", "dev": true, "license": "MIT", "dependencies": { @@ -8770,8 +7338,6 @@ }, "node_modules/array-back": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, "license": "MIT", "engines": { @@ -8780,8 +7346,6 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -8797,14 +7361,10 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8834,8 +7394,6 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8856,8 +7414,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { @@ -8875,8 +7431,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { @@ -8894,8 +7448,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8916,15 +7468,11 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "license": "MIT" }, "node_modules/asn1.js": { "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "license": "MIT", "dependencies": { "bn.js": "^4.0.0", @@ -8934,14 +7482,10 @@ }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, "node_modules/ast-types": { "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "license": "MIT", "dependencies": { @@ -8953,15 +7497,11 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -8970,14 +7510,10 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -8991,8 +7527,6 @@ }, "node_modules/axios": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.0.tgz", - "integrity": "sha512-oXTDccv8PcfjZmPGlWsPSwtOJCZ/b6W5jAMCNcfwJbCzDckwG0jrYJFaWH1yvivfCXjVzV/SPDEhMB3Q+DSurg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -9002,8 +7536,6 @@ }, "node_modules/babel-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { @@ -9024,8 +7556,6 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9041,8 +7571,6 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9058,8 +7586,6 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -9068,8 +7594,6 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -9084,8 +7608,6 @@ }, "node_modules/babel-preset-current-node-syntax": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, "license": "MIT", "dependencies": { @@ -9111,8 +7633,6 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { @@ -9128,8 +7648,6 @@ }, "node_modules/bail": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "license": "MIT", "funding": { "type": "github", @@ -9138,14 +7656,10 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -9164,8 +7678,6 @@ }, "node_modules/base64url": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", "license": "MIT", "engines": { "node": ">=6.0.0" @@ -9173,8 +7685,6 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.8.29", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz", - "integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9183,8 +7693,6 @@ }, "node_modules/basic-ftp": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, "license": "MIT", "engines": { @@ -9206,8 +7714,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -9219,8 +7725,6 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "license": "MIT", "dependencies": { @@ -9231,8 +7735,6 @@ }, "node_modules/bl/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -9256,8 +7758,6 @@ }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -9271,14 +7771,10 @@ }, "node_modules/bn.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", - "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -9301,8 +7797,6 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -9310,8 +7804,6 @@ }, "node_modules/body-parser/node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -9330,14 +7822,10 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/body-parser/node_modules/raw-body": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "license": "MIT", "dependencies": { "bytes": "~3.1.2", @@ -9351,8 +7839,6 @@ }, "node_modules/body-parser/node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9360,8 +7846,6 @@ }, "node_modules/botbuilder": { "version": "4.23.1", - "resolved": "https://registry.npmjs.org/botbuilder/-/botbuilder-4.23.1.tgz", - "integrity": "sha512-0yCkRfeeeDXPic1bo9xX9Dj/SyUDB0nNAoxxSOpBxSbClztV+Mupx2rTtExMcUKRUbSUWIKYWHL9htkT2ya5JA==", "license": "MIT", "dependencies": { "@azure/core-http": "^3.0.4", @@ -9382,8 +7866,6 @@ }, "node_modules/botbuilder-core": { "version": "4.23.1", - "resolved": "https://registry.npmjs.org/botbuilder-core/-/botbuilder-core-4.23.1.tgz", - "integrity": "sha512-lgWZ5Z8jl6MuVGxooq9eaJK/Jdqu5opJ3K3kQ/yFxG/C7VNte93BHeYviERESUMvcCNOhMRIiTrKyVYfKO4NDw==", "license": "MIT", "dependencies": { "botbuilder-dialogs-adaptive-runtime-core": "4.23.1-preview", @@ -9396,8 +7878,6 @@ }, "node_modules/botbuilder-core/node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -9409,8 +7889,6 @@ }, "node_modules/botbuilder-dialogs-adaptive-runtime-core": { "version": "4.23.1-preview", - "resolved": "https://registry.npmjs.org/botbuilder-dialogs-adaptive-runtime-core/-/botbuilder-dialogs-adaptive-runtime-core-4.23.1-preview.tgz", - "integrity": "sha512-6au9eGmEIpscP+cLYZ2G71azlj1E8rwL3WpAqfBG2RlWZCOuWH9uFNh2V9lg/KrDC2ks3O2YFk0tCym40i0XLQ==", "license": "MIT", "dependencies": { "dependency-graph": "^1.0.0" @@ -9418,14 +7896,10 @@ }, "node_modules/botbuilder-stdlib": { "version": "4.23.1-internal", - "resolved": "https://registry.npmjs.org/botbuilder-stdlib/-/botbuilder-stdlib-4.23.1-internal.tgz", - "integrity": "sha512-ChtEcnSRCDRgFuMN6ji24fHqtMERdDUP/WENX6iZQwtQUEUb12G3PcYWuaOEQhllSae6qfo3QsDW0kjGsrBX+Q==", "license": "MIT" }, "node_modules/botbuilder/node_modules/fs-extra": { "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -9438,8 +7912,6 @@ }, "node_modules/botbuilder/node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -9450,8 +7922,6 @@ }, "node_modules/botbuilder/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -9459,8 +7929,6 @@ }, "node_modules/botbuilder/node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -9472,8 +7940,6 @@ }, "node_modules/botframework-connector": { "version": "4.23.1", - "resolved": "https://registry.npmjs.org/botframework-connector/-/botframework-connector-4.23.1.tgz", - "integrity": "sha512-UqOdVndOGNN1dgtLEKDD1rObPPI32tPwyrtU8WDuVukaPSL7KYp6z1SjudZ9ywDcrt5z+Rkbz2kGzaSidCVZWA==", "license": "MIT", "dependencies": { "@azure/core-http": "^3.0.4", @@ -9500,8 +7966,6 @@ }, "node_modules/botframework-connector/node_modules/@types/jsonwebtoken": { "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", - "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -9509,8 +7973,6 @@ }, "node_modules/botframework-schema": { "version": "4.23.1", - "resolved": "https://registry.npmjs.org/botframework-schema/-/botframework-schema-4.23.1.tgz", - "integrity": "sha512-J/cjL9IFewO3Q2yuV+QGtWyzVFPgKCp/3adY5/+0MrBQasJS5IIGm45W4CV/uYuoAstOIpYJ9nQPzvNWbDN16g==", "license": "MIT", "dependencies": { "adaptivecards": "1.2.3", @@ -9520,8 +7982,6 @@ }, "node_modules/botframework-schema/node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -9533,8 +7993,6 @@ }, "node_modules/botframework-streaming": { "version": "4.23.1", - "resolved": "https://registry.npmjs.org/botframework-streaming/-/botframework-streaming-4.23.1.tgz", - "integrity": "sha512-/BjIu2BR8y/HOdJ+Wdr1nZUvW2W53G8whH65msvM95kmjEyqskeEWP62xDpZLA1OM3sLD9APNix69BX1awcbdw==", "license": "MIT", "dependencies": { "@types/node": "18.19.47", @@ -9545,8 +8003,6 @@ }, "node_modules/botframework-streaming/node_modules/@types/node": { "version": "18.19.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.47.tgz", - "integrity": "sha512-1f7dB3BL/bpd9tnDJrrHb66Y+cVrhxSOTGorRNdHwYTUlTay3HuTDPKo9a/4vX9pMQkhYBcAbL4jQdNlhCFP9A==", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" @@ -9554,14 +8010,10 @@ }, "node_modules/botframework-streaming/node_modules/undici-types": { "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "license": "MIT" }, "node_modules/botframework-streaming/node_modules/uuid": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -9573,8 +8025,6 @@ }, "node_modules/botframework-streaming/node_modules/ws": { "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", "engines": { "node": ">=8.3.0" @@ -9594,8 +8044,6 @@ }, "node_modules/brace-expansion": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -9603,8 +8051,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -9616,21 +8062,15 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "license": "MIT" }, "node_modules/browser-or-node": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-3.0.0.tgz", - "integrity": "sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==", "dev": true, "license": "MIT" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", @@ -9643,8 +8083,6 @@ }, "node_modules/browserify-cipher": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", @@ -9654,8 +8092,6 @@ }, "node_modules/browserify-des": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", @@ -9666,8 +8102,6 @@ }, "node_modules/browserify-rsa": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "license": "MIT", "dependencies": { "bn.js": "^5.2.1", @@ -9679,35 +8113,30 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", - "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "version": "4.2.3", "license": "ISC", "dependencies": { - "bn.js": "^5.2.2", - "browserify-rsa": "^4.1.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", + "elliptic": "^6.5.5", + "hash-base": "~3.0", "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", + "parse-asn1": "^5.1.7", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.12" } }, "node_modules/browserify-sign/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -9721,14 +8150,10 @@ }, "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/browserify-sign/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -9736,14 +8161,10 @@ }, "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/browserslist": { "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", "dev": true, "funding": [ { @@ -9776,8 +8197,6 @@ }, "node_modules/bs-logger": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "license": "MIT", "dependencies": { @@ -9789,8 +8208,6 @@ }, "node_modules/bser": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9799,8 +8216,6 @@ }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -9823,33 +8238,23 @@ }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "license": "MIT" }, "node_modules/builtin-status-codes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", "license": "MIT" }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -9863,8 +8268,6 @@ }, "node_modules/bundle-require": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", "dev": true, "license": "MIT", "dependencies": { @@ -9877,10 +8280,19 @@ "esbuild": ">=0.18" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9888,8 +8300,6 @@ }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -9898,8 +8308,6 @@ }, "node_modules/call-bind": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -9916,8 +8324,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -9929,8 +8335,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -9945,8 +8349,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -9955,8 +8357,6 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -9965,9 +8365,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001755", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz", - "integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -9986,8 +8383,6 @@ }, "node_modules/ccount": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "license": "MIT", "funding": { "type": "github", @@ -9996,8 +8391,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -10013,8 +8406,6 @@ }, "node_modules/chalk-template": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", "dev": true, "license": "MIT", "dependencies": { @@ -10029,14 +8420,10 @@ }, "node_modules/change-case": { "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "license": "MIT" }, "node_modules/char-regex": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -10045,8 +8432,6 @@ }, "node_modules/character-entities": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "license": "MIT", "funding": { "type": "github", @@ -10055,8 +8440,6 @@ }, "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "license": "MIT", "funding": { "type": "github", @@ -10065,8 +8448,6 @@ }, "node_modules/character-entities-legacy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "license": "MIT", "funding": { "type": "github", @@ -10075,8 +8456,6 @@ }, "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "license": "MIT", "funding": { "type": "github", @@ -10085,8 +8464,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -10110,8 +8487,6 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -10123,8 +8498,6 @@ }, "node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -10139,8 +8512,6 @@ }, "node_modules/cipher-base": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", - "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "license": "MIT", "dependencies": { "inherits": "^2.0.4", @@ -10152,15 +8523,11 @@ }, "node_modules/cjs-module-lexer": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, "node_modules/class-variance-authority": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", - "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -10172,8 +8539,6 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { @@ -10185,8 +8550,6 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -10198,18 +8561,20 @@ }, "node_modules/cli-width": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, "license": "ISC", "engines": { "node": ">= 10" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -10222,8 +8587,6 @@ }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -10239,8 +8602,6 @@ }, "node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", "engines": { @@ -10249,8 +8610,6 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "dev": true, "license": "MIT", "engines": { @@ -10259,8 +8618,6 @@ }, "node_modules/cmdk": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", - "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", "dev": true, "license": "MIT", "dependencies": { @@ -10276,8 +8633,6 @@ }, "node_modules/co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { @@ -10287,8 +8642,6 @@ }, "node_modules/codemirror": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", @@ -10302,22 +8655,16 @@ }, "node_modules/collect-v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true, "license": "MIT" }, "node_modules/collection-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", - "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==", "dev": true, "license": "Apache-2.0" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -10328,20 +8675,14 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/colorette": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -10352,8 +8693,6 @@ }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "license": "MIT", "funding": { "type": "github", @@ -10362,8 +8701,6 @@ }, "node_modules/command-line-args": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, "license": "MIT", "dependencies": { @@ -10378,8 +8715,6 @@ }, "node_modules/command-line-usage": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10394,8 +8729,6 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, "license": "MIT", "engines": { @@ -10404,8 +8737,6 @@ }, "node_modules/command-line-usage/node_modules/typical": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "dev": true, "license": "MIT", "engines": { @@ -10414,8 +8745,6 @@ }, "node_modules/commander": { "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "license": "MIT", "engines": { @@ -10424,8 +8753,6 @@ }, "node_modules/component-emitter": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, "license": "MIT", "funding": { @@ -10434,15 +8761,11 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, "node_modules/concurrently": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "dev": true, "license": "MIT", "dependencies": { @@ -10466,8 +8789,6 @@ }, "node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10482,8 +8803,6 @@ }, "node_modules/consola": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, "license": "MIT", "engines": { @@ -10492,8 +8811,6 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -10504,8 +8821,6 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -10513,15 +8828,11 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -10529,27 +8840,19 @@ }, "node_modules/cookie-signature": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, "node_modules/cookiejar": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true, "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -10561,8 +8864,6 @@ }, "node_modules/create-ecdh": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "license": "MIT", "dependencies": { "bn.js": "^4.1.0", @@ -10571,14 +8872,10 @@ }, "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", @@ -10590,8 +8887,6 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", @@ -10604,8 +8899,6 @@ }, "node_modules/create-jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10626,21 +8919,15 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/crelt": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, "node_modules/cross-env": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, "license": "MIT", "dependencies": { @@ -10658,8 +8945,6 @@ }, "node_modules/cross-fetch": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", "dependencies": { "node-fetch": "^2.7.0" @@ -10667,8 +8952,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -10681,8 +8964,6 @@ }, "node_modules/crypto-browserify": { "version": "3.12.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", - "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.1", @@ -10707,14 +8988,10 @@ }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "license": "MIT", "engines": { @@ -10723,8 +9000,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10741,8 +9016,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10759,8 +9032,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10777,8 +9048,6 @@ }, "node_modules/date-fns": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "license": "MIT", "funding": { "type": "github", @@ -10787,14 +9056,10 @@ }, "node_modules/dayjs": { "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -10810,8 +9075,6 @@ }, "node_modules/decode-named-character-reference": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -10823,8 +9086,6 @@ }, "node_modules/dedent": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10838,8 +9099,6 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "license": "MIT", "engines": { @@ -10848,15 +9107,11 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -10865,8 +9120,6 @@ }, "node_modules/default-browser": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -10881,8 +9134,6 @@ }, "node_modules/default-browser-id": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "license": "MIT", "engines": { "node": ">=18" @@ -10893,8 +9144,6 @@ }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", "dependencies": { @@ -10906,8 +9155,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -10923,8 +9170,6 @@ }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { "node": ">=12" @@ -10935,8 +9180,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -10953,8 +9196,6 @@ }, "node_modules/degenerator": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10968,8 +9209,6 @@ }, "node_modules/del": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/del/-/del-8.0.1.tgz", - "integrity": "sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==", "dev": true, "license": "MIT", "dependencies": { @@ -10990,8 +9229,6 @@ }, "node_modules/del/node_modules/globby": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "dev": true, "license": "MIT", "dependencies": { @@ -11011,8 +9248,6 @@ }, "node_modules/del/node_modules/ignore": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -11021,8 +9256,6 @@ }, "node_modules/del/node_modules/path-type": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "dev": true, "license": "MIT", "engines": { @@ -11034,8 +9267,6 @@ }, "node_modules/del/node_modules/slash": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { @@ -11047,8 +9278,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -11056,8 +9285,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11065,8 +9292,6 @@ }, "node_modules/dependency-graph": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "license": "MIT", "engines": { "node": ">=4" @@ -11074,8 +9299,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -11083,8 +9306,6 @@ }, "node_modules/des.js": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "license": "MIT", "dependencies": { "inherits": "^2.0.1", @@ -11093,8 +9314,6 @@ }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { "node": ">= 0.8", @@ -11113,8 +9332,6 @@ }, "node_modules/detect-newline": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -11123,15 +9340,11 @@ }, "node_modules/detect-node-es": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "dev": true, "license": "MIT" }, "node_modules/devlop": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "license": "MIT", "dependencies": { "dequal": "^2.0.0" @@ -11143,8 +9356,6 @@ }, "node_modules/dezalgo": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "license": "ISC", "dependencies": { @@ -11153,9 +9364,7 @@ } }, "node_modules/diff": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", - "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "version": "4.0.2", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -11164,8 +9373,6 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -11174,8 +9381,6 @@ }, "node_modules/diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "license": "MIT", "dependencies": { "bn.js": "^4.1.0", @@ -11185,8 +9390,6 @@ }, "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, "node_modules/dir-glob": { @@ -11204,8 +9407,6 @@ }, "node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11217,8 +9418,6 @@ }, "node_modules/dom-helpers": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", @@ -11227,8 +9426,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", @@ -11241,8 +9438,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", @@ -11253,8 +9448,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" @@ -11268,8 +9461,6 @@ }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", @@ -11282,8 +9473,6 @@ }, "node_modules/dotenv": { "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11295,8 +9484,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -11309,15 +9496,11 @@ }, "node_modules/eastasianwidth": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -11325,14 +9508,10 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -11347,15 +9526,11 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.255", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.255.tgz", - "integrity": "sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==", "dev": true, "license": "ISC" }, "node_modules/elliptic": { "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "license": "MIT", "dependencies": { "bn.js": "^4.11.9", @@ -11369,20 +9544,14 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", "license": "MIT" }, "node_modules/embla-carousel": { "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", "license": "MIT" }, "node_modules/embla-carousel-autoplay": { "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.6.0.tgz", - "integrity": "sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==", "license": "MIT", "peerDependencies": { "embla-carousel": "8.6.0" @@ -11390,8 +9559,6 @@ }, "node_modules/embla-carousel-fade": { "version": "8.6.0", - "resolved": "https://registry.npmjs.org/embla-carousel-fade/-/embla-carousel-fade-8.6.0.tgz", - "integrity": "sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==", "license": "MIT", "peerDependencies": { "embla-carousel": "8.6.0" @@ -11399,8 +9566,6 @@ }, "node_modules/emittery": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -11412,14 +9577,10 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11427,8 +9588,6 @@ }, "node_modules/enquirer": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11441,8 +9600,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -11452,36 +9609,45 @@ } }, "node_modules/env-cmd": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", - "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-11.0.0.tgz", + "integrity": "sha512-gnG7H1PlwPqsGhFJNTv68lsDGyQdK+U9DwLVitcj1+wGq7LeOBgUzZd2puZ710bHcH9NfNeGWe2sbw7pdvAqDw==", "dev": true, "license": "MIT", "dependencies": { - "commander": "^4.0.0", - "cross-spawn": "^7.0.0" + "@commander-js/extra-typings": "^13.1.0", + "commander": "^13.1.0", + "cross-spawn": "^7.0.6" }, "bin": { "env-cmd": "bin/env-cmd.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=20.10.0" + } + }, + "node_modules/env-cmd/node_modules/@commander-js/extra-typings": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-13.1.0.tgz", + "integrity": "sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "commander": "~13.1.0" } }, "node_modules/env-cmd/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=18" } }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "license": "MIT", "dependencies": { @@ -11490,8 +9656,6 @@ }, "node_modules/es-abstract": { "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "license": "MIT", "dependencies": { @@ -11556,8 +9720,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -11565,8 +9727,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -11574,8 +9734,6 @@ }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -11586,8 +9744,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -11601,8 +9757,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { @@ -11614,8 +9768,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -11632,8 +9784,6 @@ }, "node_modules/esbuild": { "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -11673,8 +9823,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -11682,14 +9830,10 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -11701,8 +9845,6 @@ }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11723,8 +9865,6 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "optional": true, @@ -11734,8 +9874,6 @@ }, "node_modules/eslint": { "version": "9.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", - "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", "dependencies": { @@ -11795,8 +9933,6 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { @@ -11807,8 +9943,6 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11817,8 +9951,6 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "license": "MIT", "dependencies": { @@ -11835,8 +9967,6 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11845,8 +9975,6 @@ }, "node_modules/eslint-plugin-import": { "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "license": "MIT", "dependencies": { @@ -11879,8 +10007,6 @@ }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -11890,8 +10016,6 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11900,8 +10024,6 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -11913,8 +10035,6 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -11923,8 +10043,6 @@ }, "node_modules/eslint-plugin-react-compiler": { "version": "19.0.0-beta-ebf51a3-20250411", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-19.0.0-beta-ebf51a3-20250411.tgz", - "integrity": "sha512-R7ncuwbCPFAoeMlS56DGGSJFxmRtlWafYH/iWyep5Ks0RaPqTCL4k5gA87axUBBcITsaIgUGkbqAxDxl8Xfm5A==", "dev": true, "license": "MIT", "dependencies": { @@ -11944,8 +10062,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { @@ -11957,8 +10073,6 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.4.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", - "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -11967,8 +10081,6 @@ }, "node_modules/eslint-scope": { "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11984,8 +10096,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11997,8 +10107,6 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -12014,8 +10122,6 @@ }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -12025,8 +10131,6 @@ }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -12042,15 +10146,11 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -12065,8 +10165,6 @@ }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -12078,8 +10176,6 @@ }, "node_modules/eslint/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12094,8 +10190,6 @@ }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -12110,8 +10204,6 @@ }, "node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12128,8 +10220,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -12142,8 +10232,6 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12155,8 +10243,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12168,8 +10254,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -12178,8 +10262,6 @@ }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "license": "MIT", "funding": { "type": "opencollective", @@ -12188,15 +10270,11 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -12205,8 +10283,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12214,8 +10290,6 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "engines": { "node": ">=6" @@ -12223,8 +10297,6 @@ }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -12233,8 +10305,6 @@ }, "node_modules/eventsource": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", - "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -12245,8 +10315,6 @@ }, "node_modules/eventsource-parser": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", - "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -12254,8 +10322,6 @@ }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "license": "MIT", "dependencies": { "md5.js": "^1.3.4", @@ -12264,8 +10330,6 @@ }, "node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -12288,8 +10352,6 @@ }, "node_modules/exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -12297,8 +10359,6 @@ }, "node_modules/expect": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { @@ -12314,8 +10374,6 @@ }, "node_modules/express": { "version": "4.22.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.0.tgz", - "integrity": "sha512-c2iPh3xp5vvCLgaHK03+mWLFPhox7j1LwyxcZwFVApEv5i0X+IjPpbT50SJJwwLpdBVfp45AkK/v+AFgv/XlfQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -12360,8 +10418,6 @@ }, "node_modules/express-rate-limit": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "license": "MIT", "engines": { "node": ">= 16" @@ -12375,8 +10431,6 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -12384,14 +10438,10 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, "node_modules/extendable-error": { @@ -12403,14 +10453,10 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -12426,8 +10472,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -12439,29 +10483,21 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -12476,8 +10512,6 @@ }, "node_modules/fastq": { "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -12486,8 +10520,6 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12496,8 +10528,6 @@ }, "node_modules/fdir": { "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -12511,8 +10541,6 @@ }, "node_modules/fetch-blob": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", "dev": true, "funding": [ { @@ -12535,8 +10563,6 @@ }, "node_modules/fetch-blob/node_modules/web-streams-polyfill": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dev": true, "license": "MIT", "engines": { @@ -12545,8 +10571,6 @@ }, "node_modules/figures": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "license": "MIT", "dependencies": { @@ -12561,8 +10585,6 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -12571,8 +10593,6 @@ }, "node_modules/file-entry-cache": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12584,8 +10604,6 @@ }, "node_modules/filelist": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12594,8 +10612,6 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -12607,8 +10623,6 @@ }, "node_modules/filename-reserved-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "license": "MIT", "engines": { "node": ">=4" @@ -12616,8 +10630,6 @@ }, "node_modules/filenamify": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", "license": "MIT", "dependencies": { "filename-reserved-regex": "^2.0.0", @@ -12633,8 +10645,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -12646,8 +10656,6 @@ }, "node_modules/finalhandler": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { "debug": "2.6.9", @@ -12664,8 +10672,6 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { "ms": "2.0.0" @@ -12673,14 +10679,10 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/finalhandler/node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -12688,8 +10690,6 @@ }, "node_modules/find-replace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12701,8 +10701,6 @@ }, "node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -12715,8 +10713,6 @@ }, "node_modules/flat-cache": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { @@ -12729,15 +10725,11 @@ }, "node_modules/flatted": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -12756,8 +10748,6 @@ }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -12771,8 +10761,6 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { @@ -12788,8 +10776,6 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -12801,8 +10787,6 @@ }, "node_modules/form-data": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -12817,15 +10801,11 @@ }, "node_modules/form-data-encoder": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", "license": "MIT", "peer": true }, "node_modules/formdata-node": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12838,8 +10818,6 @@ }, "node_modules/formdata-polyfill": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dev": true, "license": "MIT", "dependencies": { @@ -12851,8 +10829,6 @@ }, "node_modules/formidable": { "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, "license": "MIT", "dependencies": { @@ -12869,8 +10845,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12878,8 +10852,6 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12887,8 +10859,6 @@ }, "node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "license": "MIT", "dependencies": { @@ -12902,17 +10872,12 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -12924,8 +10889,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12933,8 +10896,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12954,8 +10915,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -12964,8 +10923,6 @@ }, "node_modules/fuse.js": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", "license": "Apache-2.0", "engines": { "node": ">=10" @@ -12973,8 +10930,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -12983,8 +10938,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -12992,8 +10945,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -13016,8 +10967,6 @@ }, "node_modules/get-nonce": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "dev": true, "license": "MIT", "engines": { @@ -13026,8 +10975,6 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -13036,8 +10983,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -13049,8 +10994,6 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -13062,8 +11005,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -13080,8 +11021,6 @@ }, "node_modules/get-tsconfig": { "version": "4.11.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.11.0.tgz", - "integrity": "sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13093,8 +11032,6 @@ }, "node_modules/get-uri": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13108,9 +11045,6 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -13130,8 +11064,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -13143,8 +11075,6 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -13154,8 +11084,6 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -13167,8 +11095,6 @@ }, "node_modules/globals": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { @@ -13180,8 +11106,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13218,8 +11142,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -13230,14 +11152,10 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/gradient-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", - "integrity": "sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==", "dev": true, "license": "MIT", "dependencies": { @@ -13250,15 +11168,11 @@ }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/graphql": { "version": "0.11.7", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.11.7.tgz", - "integrity": "sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==", "dev": true, "license": "MIT", "dependencies": { @@ -13267,8 +11181,6 @@ }, "node_modules/handlebars": { "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "license": "MIT", "dependencies": { "minimist": "^1.2.5", @@ -13288,8 +11200,6 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13297,8 +11207,6 @@ }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -13310,8 +11218,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -13320,8 +11226,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -13332,8 +11236,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13348,8 +11250,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -13360,8 +11260,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -13375,8 +11273,6 @@ }, "node_modules/hash-base": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", - "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "license": "MIT", "dependencies": { "inherits": "^2.0.4", @@ -13388,8 +11284,6 @@ }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -13398,8 +11292,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -13410,8 +11302,6 @@ }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -13437,8 +11327,6 @@ }, "node_modules/hast-util-whitespace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" @@ -13450,15 +11338,11 @@ }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", "dependencies": { @@ -13467,8 +11351,6 @@ }, "node_modules/highlight.js": { "version": "11.11.1", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", - "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", "license": "BSD-3-Clause", "engines": { "node": ">=12.0.0" @@ -13476,8 +11358,6 @@ }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "license": "MIT", "dependencies": { "hash.js": "^1.0.3", @@ -13486,26 +11366,19 @@ } }, "node_modules/hono": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", - "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", + "version": "4.11.5", "license": "MIT", - "peer": true, "engines": { "node": ">=16.9.0" } }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/html-url-attributes": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -13514,8 +11387,6 @@ }, "node_modules/htmlparser2": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", - "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -13533,8 +11404,6 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -13549,8 +11418,6 @@ }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "license": "MIT", "dependencies": { "agent-base": "^7.1.0", @@ -13562,14 +11429,10 @@ }, "node_modules/https-browserify": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", "license": "MIT" }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { "agent-base": "^7.1.2", @@ -13581,8 +11444,6 @@ }, "node_modules/human-id": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.1.tgz", - "integrity": "sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==", "dev": true, "license": "MIT", "bin": { @@ -13591,8 +11452,6 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -13601,8 +11460,6 @@ }, "node_modules/humanize-ms": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "license": "MIT", "peer": true, "dependencies": { @@ -13611,8 +11468,6 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -13623,8 +11478,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -13643,8 +11496,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -13653,15 +11504,11 @@ }, "node_modules/ignore-by-default": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true, "license": "ISC" }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13677,8 +11524,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -13687,8 +11532,6 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -13707,8 +11550,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -13717,8 +11558,6 @@ }, "node_modules/index-to-position": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz", - "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==", "license": "MIT", "engines": { "node": ">=18" @@ -13729,9 +11568,6 @@ }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -13741,27 +11577,19 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "license": "MIT" }, "node_modules/inquirer": { "version": "8.2.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", - "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", "dev": true, "license": "MIT", "dependencies": { @@ -13787,8 +11615,6 @@ }, "node_modules/inquirer/node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -13804,8 +11630,6 @@ }, "node_modules/inquirer/node_modules/ora": { "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13828,8 +11652,6 @@ }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -13843,8 +11665,6 @@ }, "node_modules/ip-address": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, "license": "MIT", "dependencies": { @@ -13857,15 +11677,11 @@ }, "node_modules/ip-address/node_modules/sprintf-js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", "engines": { "node": ">= 0.10" @@ -13873,8 +11689,6 @@ }, "node_modules/is-alphabetical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "license": "MIT", "funding": { "type": "github", @@ -13883,8 +11697,6 @@ }, "node_modules/is-alphanumerical": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", @@ -13897,8 +11709,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -13915,15 +11725,11 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13942,8 +11748,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13958,8 +11762,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -13971,8 +11773,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -13988,8 +11788,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -14000,8 +11798,6 @@ }, "node_modules/is-core-module": { "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -14016,8 +11812,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -14034,8 +11828,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -14051,8 +11843,6 @@ }, "node_modules/is-decimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "license": "MIT", "funding": { "type": "github", @@ -14061,8 +11851,6 @@ }, "node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "license": "MIT", "bin": { "is-docker": "cli.js" @@ -14076,8 +11864,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -14086,8 +11872,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -14102,8 +11886,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" @@ -14111,8 +11893,6 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -14121,8 +11901,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14140,8 +11918,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -14153,8 +11929,6 @@ }, "node_modules/is-hexadecimal": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "license": "MIT", "funding": { "type": "github", @@ -14163,8 +11937,6 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -14181,8 +11953,6 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, "license": "MIT", "engines": { @@ -14191,8 +11961,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -14204,15 +11972,11 @@ }, "node_modules/is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true, "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -14221,8 +11985,6 @@ }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -14238,8 +12000,6 @@ }, "node_modules/is-path-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "dev": true, "license": "MIT", "engines": { @@ -14251,8 +12011,6 @@ }, "node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, "license": "MIT", "engines": { @@ -14264,8 +12022,6 @@ }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "license": "MIT", "engines": { "node": ">=12" @@ -14276,14 +12032,10 @@ }, "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -14301,8 +12053,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -14314,8 +12064,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -14330,8 +12078,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -14343,8 +12089,6 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -14373,8 +12117,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -14391,8 +12133,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -14406,8 +12146,6 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -14419,15 +12157,11 @@ }, "node_modules/is-url": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true, "license": "MIT" }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -14439,8 +12173,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -14455,8 +12187,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14482,8 +12212,6 @@ }, "node_modules/is-wsl": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -14497,14 +12225,10 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isbinaryfile": { "version": "5.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.6.tgz", - "integrity": "sha512-I+NmIfBHUl+r2wcDd6JwE9yWje/PIVY/R5/CmV8dXLZd5K+L9X2klAOwfAHNnondLXkbHyTAleQAWonpTJBTtw==", "dev": true, "license": "MIT", "engines": { @@ -14516,14 +12240,10 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -14532,8 +12252,6 @@ }, "node_modules/istanbul-lib-instrument": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14549,8 +12267,6 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14564,8 +12280,6 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14579,8 +12293,6 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -14589,8 +12301,6 @@ }, "node_modules/istanbul-reports": { "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14603,15 +12313,11 @@ }, "node_modules/iterall": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", - "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==", "dev": true, "license": "MIT" }, "node_modules/jackspeak": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -14626,8 +12332,6 @@ }, "node_modules/jake": { "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14645,8 +12349,6 @@ }, "node_modules/jake/node_modules/brace-expansion": { "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -14656,8 +12358,6 @@ }, "node_modules/jake/node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -14669,8 +12369,6 @@ }, "node_modules/jest": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -14696,8 +12394,6 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { @@ -14711,8 +12407,6 @@ }, "node_modules/jest-changed-files/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14727,8 +12421,6 @@ }, "node_modules/jest-circus": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { @@ -14759,8 +12451,6 @@ }, "node_modules/jest-circus/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14775,8 +12465,6 @@ }, "node_modules/jest-cli": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -14809,8 +12497,6 @@ }, "node_modules/jest-config": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14855,8 +12541,6 @@ }, "node_modules/jest-diff": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { @@ -14871,8 +12555,6 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -14884,8 +12566,6 @@ }, "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14901,8 +12581,6 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { @@ -14919,8 +12597,6 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { @@ -14929,8 +12605,6 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -14955,8 +12629,6 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { @@ -14969,8 +12641,6 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { @@ -14985,8 +12655,6 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { @@ -15006,8 +12674,6 @@ }, "node_modules/jest-mock": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { @@ -15021,8 +12687,6 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -15039,8 +12703,6 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { @@ -15049,8 +12711,6 @@ }, "node_modules/jest-resolve": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { @@ -15070,8 +12730,6 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { @@ -15084,8 +12742,6 @@ }, "node_modules/jest-runner": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15117,8 +12773,6 @@ }, "node_modules/jest-runner/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15133,8 +12787,6 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15167,8 +12819,6 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -15199,8 +12849,6 @@ }, "node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -15217,8 +12865,6 @@ }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -15230,8 +12876,6 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -15248,8 +12892,6 @@ }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -15261,8 +12903,6 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { @@ -15281,8 +12921,6 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -15297,8 +12935,6 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -15313,8 +12949,6 @@ }, "node_modules/jose": { "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -15322,8 +12956,6 @@ }, "node_modules/joycon": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "dev": true, "license": "MIT", "engines": { @@ -15332,15 +12964,11 @@ }, "node_modules/js-base64": { "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/js-levenshtein": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15348,14 +12976,10 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -15368,15 +12992,11 @@ }, "node_modules/jsbn": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -15388,22 +13008,16 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-to-zod": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/json-schema-to-zod/-/json-schema-to-zod-2.6.1.tgz", - "integrity": "sha512-uiHmWH21h9FjKJkRBntfVGTLpYlCZ1n98D0izIlByqQLqpmkQpNTBtfbdP04Na6+43lgsvrShFh2uWLkQDKJuQ==", "license": "ISC", "bin": { "json-schema-to-zod": "dist/cjs/cli.js" @@ -15411,33 +13025,19 @@ }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-schema-typed": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -15449,8 +13049,6 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -15459,8 +13057,6 @@ }, "node_modules/jsonwebtoken": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "license": "MIT", "dependencies": { "jws": "^3.2.2", @@ -15481,8 +13077,6 @@ }, "node_modules/jwa": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", @@ -15492,8 +13086,6 @@ }, "node_modules/jwks-rsa": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", - "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", "license": "MIT", "dependencies": { "@types/express": "^4.17.20", @@ -15509,8 +13101,6 @@ }, "node_modules/jwks-rsa/node_modules/@types/express": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", @@ -15521,8 +13111,6 @@ }, "node_modules/jwks-rsa/node_modules/@types/express-serve-static-core": { "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -15533,8 +13121,6 @@ }, "node_modules/jws": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", - "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", "license": "MIT", "dependencies": { "jwa": "^1.4.2", @@ -15543,8 +13129,6 @@ }, "node_modules/jwt-decode": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", "license": "MIT", "engines": { "node": ">=18" @@ -15552,14 +13136,10 @@ }, "node_modules/keyborg": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/keyborg/-/keyborg-2.6.0.tgz", - "integrity": "sha512-o5kvLbuTF+o326CMVYpjlaykxqYP9DphFQZ2ZpgrvBouyvOxyEB7oqe8nOLFpiV5VCtz0D3pt8gXQYWpLpBnmA==", "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -15568,8 +13148,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { @@ -15578,8 +13156,6 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -15588,8 +13164,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15602,8 +13176,6 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -15614,21 +13186,15 @@ } }, "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + "version": "1.1.5" }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/load-tsconfig": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", "dev": true, "license": "MIT", "engines": { @@ -15637,8 +13203,6 @@ }, "node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -15650,5222 +13214,3933 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "license": "MIT" }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", "dev": true, "license": "MIT" }, "node_modules/lodash.includes": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "license": "MIT", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/lucide-react": { - "version": "0.523.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.523.0.tgz", - "integrity": "sha512-rUjQoy7egZT9XYVXBK1je9ckBnNp7qzRZOhLQx5RcEp2dCGlXo+mv6vf7Am4LimEcFBJIIZzSGfgTqc9QCrPSw==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-newline-to-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-2.0.0.tgz", - "integrity": "sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-find-and-replace": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true, "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/log-symbols": { + "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "chalk": "^2.4.2" }, "engines": { - "node": ">=8.6" + "node": ">=8" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=4" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">=4" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "dev": true, "license": "MIT" }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4.0.0" + "node": ">=0.8.0" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, + "node_modules/longest-streak": { + "version": "3.1.0", "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/lru-cache": { + "version": "5.1.1", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "yallist": "^3.0.2" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/lru-memoizer": { + "version": "2.3.0", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, + "node_modules/lru-memoizer/node_modules/lru-cache": { + "version": "6.0.0", "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/lru-memoizer/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/lucide-react": { + "version": "0.523.0", + "dev": true, + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "semver": "^7.5.3" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", "license": "MIT", - "engines": { - "node": "*" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, + "node_modules/math-intrinsics": { + "version": "1.1.0", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/mdast-util-gfm": { + "version": "3.1.0", "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", "license": "MIT", - "engines": { - "node": ">= 0.4.0" + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", "license": "MIT", - "engines": { - "node": ">=10.5.0" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-plop": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.32.1.tgz", - "integrity": "sha512-yQLFYO/ELC3pIMrEVvwBPU6fcCMWFFqMsK49Zqp4TfNNo1PDcEbC/xcfX1SIu+Ez5QO/Skq/0t8ogsKicwLZWg==", - "dev": true, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "@types/inquirer": "^9.0.9", - "change-case": "^5.4.4", - "del": "^8.0.0", - "globby": "^14.1.0", - "handlebars": "^4.7.8", - "inquirer": "^9.3.7", - "isbinaryfile": "^5.0.6", - "lodash.get": "^4.4.2", - "mkdirp": "^3.0.1", - "resolve": "^1.22.10", - "title-case": "^4.3.2" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/inquirer": { - "version": "9.3.8", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", - "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", - "dev": true, + "node_modules/mdast-util-newline-to-break": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "@inquirer/external-editor": "^1.0.2", - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "@types/mdast": "^4.0.0", + "mdast-util-find-and-replace": "^3.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/log-symbols": { + "node_modules/mdast-util-phrasing": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@types/mdast": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/node-plop/node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, + "node_modules/media-typer": { + "version": "0.3.0", "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">= 0.6" } }, - "node_modules/node-plop/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, + "node_modules/merge-descriptors": { + "version": "1.0.3", "license": "MIT", - "engines": { - "node": ">=14.16" - }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "node_modules/merge-stream": { + "version": "2.0.0", "dev": true, "license": "MIT" }, - "node_modules/nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "node_modules/merge2": { + "version": "1.4.1", "dev": true, "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "node": ">= 8" } }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/methods": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "node_modules/micromark": { + "version": "4.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "wrappy": "1" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/open": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "wsl-utils": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/openai": { - "version": "4.96.2", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.96.2.tgz", - "integrity": "sha512-R2XnxvMsizkROr7BV3uNp1q/3skwPZ7fmPjO1bXLnfB4Tu5xKxrT1EVwzjhxn0MZKBKAvOaGWS63jTMN6KrIXA==", - "license": "Apache-2.0", - "peer": true, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, - "zod": { - "optional": true + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.87", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.87.tgz", - "integrity": "sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==", + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "peer": true, "dependencies": { - "undici-types": "~5.26.4" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/openai/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "peer": true + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/openapi-typescript": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.6.1.tgz", - "integrity": "sha512-F7RXEeo/heF3O9lOXo2bNjCOtfp7u+D6W3a3VNEH2xE6v+fxLtn5nq0uvUcA1F5aT+CMhNeC5Uqtg5tlXFX/ag==", + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@redocly/openapi-core": "^1.28.0", - "ansi-colors": "^4.1.3", - "change-case": "^5.4.4", - "parse-json": "^8.1.0", - "supports-color": "^9.4.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "openapi-typescript": "bin/cli.js" - }, - "peerDependencies": { - "typescript": "^5.x" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/openapi-typescript/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-types": "^2.0.0" } }, - "node_modules/openapi-typescript/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/openapi-typescript/node_modules/type-fest": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", - "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/openssl-wrapper": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/openssl-wrapper/-/openssl-wrapper-0.3.4.tgz", - "integrity": "sha512-iITsrx6Ho8V3/2OVtmZzzX8wQaKAaFXEJQdzoPUZDtyf5jWFlqo+h+OhGT4TATQ47f9ACKHua8nw7Qoy85aeKQ==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/micromark-util-types": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8.6" } }, - "node_modules/ora": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", - "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.2.0", - "is-interactive": "^1.0.0", - "log-symbols": "^3.0.0", - "mute-stream": "0.0.8", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, "engines": { - "node": ">=8" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/ora/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, + "node_modules/miller-rabin": { + "version": "4.0.1", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.2", "license": "MIT" }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "node_modules/mime": { + "version": "2.6.0", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.0.0" } }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "p-map": "^2.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/p-filter/node_modules/p-map": { + "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.5", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "p-try": "^2.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/minimist": { + "version": "1.2.8", "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "node_modules/mkdirp": { + "version": "3.0.1", "dev": true, "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/moment": { + "version": "2.30.1", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "node_modules/mri": { + "version": "1.2.0", "dev": true, "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, "engines": { - "node": ">= 14" + "node": ">=4" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "dev": true, + "license": "ISC" + }, + "node_modules/mz": { + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">= 14" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, - "license": "BlueOak-1.0.0" + "license": "MIT" }, - "node_modules/package-manager-detector": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", - "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==", - "dev": true, + "node_modules/negotiator": { + "version": "0.6.3", "license": "MIT", - "dependencies": { - "quansync": "^0.2.7" + "engines": { + "node": ">= 0.6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true, - "license": "(MIT AND Zlib)" + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/netmask": { + "version": "2.0.2", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/next": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" }, "engines": { - "node": ">=6" + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } } }, - "node_modules/parse-asn1": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", - "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", - "license": "ISC", + "node_modules/next/node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "license": "Apache-2.0", "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "pbkdf2": "^3.1.5", - "safe-buffer": "^5.2.1" + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 0.10" + "node": "^10 || ^12 || >=14" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" + "whatwg-url": "^5.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, "license": "MIT" }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/node-plop": { + "version": "0.32.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "@types/inquirer": "^9.0.9", + "change-case": "^5.4.4", + "del": "^8.0.0", + "globby": "^14.1.0", + "handlebars": "^4.7.8", + "inquirer": "^9.3.7", + "isbinaryfile": "^5.0.6", + "lodash.get": "^4.4.2", + "mkdirp": "^3.0.1", + "resolve": "^1.22.10", + "title-case": "^4.3.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", + "node_modules/node-plop/node_modules/cli-width": { + "version": "4.1.0", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.8" + "node": ">= 12" } }, - "node_modules/path-equal": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz", - "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/node-plop/node_modules/globby": { + "version": "14.1.0", "dev": true, "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/node-plop/node_modules/ignore": { + "version": "7.0.5", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "node_modules/node-plop/node_modules/inquirer": { + "version": "9.3.8", "dev": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", + "dependencies": { + "@inquirer/external-editor": "^1.0.2", + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "node_modules/node-plop/node_modules/log-symbols": { + "version": "4.1.0", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": "20 || >=22" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "node_modules/node-plop/node_modules/mute-stream": { + "version": "1.0.0", "dev": true, "license": "ISC", "engines": { - "node": "20 || >=22" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/node-plop/node_modules/ora": { + "version": "5.4.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", - "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", - "license": "MIT", "dependencies": { - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "ripemd160": "^2.0.3", - "safe-buffer": "^5.2.1", - "sha.js": "^2.4.12", - "to-buffer": "^1.2.1" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/node-plop/node_modules/path-type": { + "version": "6.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/node-plop/node_modules/run-async": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.12.0" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/node-plop/node_modules/slash": { + "version": "5.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkce-challenge": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", - "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.10", + "dev": true, "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, "engines": { - "node": ">=16.20.0" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "has-flag": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=4" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "lilconfig": "^3.1.1" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/object-assign": { + "version": "4.1.1", "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/presentable-error": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/presentable-error/-/presentable-error-0.0.1.tgz", - "integrity": "sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==", - "dev": true, + "node_modules/object-inspect": { + "version": "1.13.4", "license": "MIT", "engines": { - "node": ">=16" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/object.assign": { + "version": "4.1.7", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/object.fromentries": { + "version": "2.0.8", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "node_modules/object.groupby": { + "version": "1.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "node_modules/object.values": { + "version": "1.2.1", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/on-finished": { + "version": "2.4.1", "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">= 0.6.0" + "node": ">= 0.8" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/onetime": { + "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/open": { + "version": "10.2.0", "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "node_modules/openai": { + "version": "4.96.2", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } }, - "node_modules/property-information": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", - "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.87", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT", + "peer": true + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "license": "MIT" + }, + "node_modules/openapi-typescript": { + "version": "7.6.1", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "@redocly/openapi-core": "^1.28.0", + "ansi-colors": "^4.1.3", + "change-case": "^5.4.4", + "parse-json": "^8.1.0", + "supports-color": "^9.4.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" }, - "engines": { - "node": ">= 0.10" + "peerDependencies": { + "typescript": "^5.x" } }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "dev": true, + "node_modules/openapi-typescript/node_modules/parse-json": { + "version": "8.3.0", "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" }, "engines": { - "node": ">= 14" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", + "node_modules/openapi-typescript/node_modules/supports-color": { + "version": "9.4.0", + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/openapi-typescript/node_modules/type-fest": { + "version": "4.40.1", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "node_modules/openssl-wrapper": { + "version": "0.3.4", "license": "MIT" }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/optionator": { + "version": "0.9.4", "dev": true, "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "node_modules/ora": { + "version": "4.1.1", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.1.0" + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=0.6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "node_modules/ora/node_modules/chalk": { + "version": "3.0.0", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/outdent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", + "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/quicktype": { - "version": "23.1.1", - "resolved": "https://registry.npmjs.org/quicktype/-/quicktype-23.1.1.tgz", - "integrity": "sha512-oyIMWpg/RVJ0XWe5sfHmFDJPzjZYaoQe0JYpgHDiSLcb3D4edzEunk/mh1NPUw04SXVQRTPJXDvvTHUOyHqmxw==", + "node_modules/own-keys": { + "version": "1.0.1", "dev": true, - "license": "Apache-2.0", - "workspaces": [ - "./packages/quicktype-core", - "./packages/quicktype-graphql-input", - "./packages/quicktype-typescript-input", - "./packages/quicktype-vscode" - ], + "license": "MIT", "dependencies": { - "@glideapps/ts-necessities": "^2.2.3", - "chalk": "^4.1.2", - "collection-utils": "^1.0.1", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.1", - "cross-fetch": "^4.0.0", - "graphql": "^0.11.7", - "lodash": "^4.17.21", - "moment": "^2.30.1", - "quicktype-core": "23.1.1", - "quicktype-graphql-input": "23.1.1", - "quicktype-typescript-input": "23.1.1", - "readable-stream": "^4.5.2", - "stream-json": "1.8.0", - "string-to-stream": "^3.0.1", - "typescript": "4.9.5" - }, - "bin": { - "quicktype": "dist/index.js" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">=18.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quicktype-core": { - "version": "23.1.1", - "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.1.1.tgz", - "integrity": "sha512-YhbUh6dXr+yTNl9Jgh85r6t9xkztIqPsgs3hI10r/ULsG3Fo15UgXgSFS6CIQ/PU76ptCBM9x+1a39i5+nwpqw==", + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@glideapps/ts-necessities": "2.2.3", - "browser-or-node": "^3.0.0", - "collection-utils": "^1.0.1", - "cross-fetch": "^4.0.0", - "is-url": "^1.2.4", - "js-base64": "^3.7.7", - "lodash": "^4.17.21", - "pako": "^1.0.6", - "pluralize": "^8.0.0", - "readable-stream": "4.5.2", - "unicode-properties": "^1.4.1", - "urijs": "^1.19.1", - "wordwrap": "^1.0.0", - "yaml": "^2.4.1" + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/quicktype-core/node_modules/@glideapps/ts-necessities": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.2.3.tgz", - "integrity": "sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/quicktype-core/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/quicktype-graphql-input": { - "version": "23.1.1", - "resolved": "https://registry.npmjs.org/quicktype-graphql-input/-/quicktype-graphql-input-23.1.1.tgz", - "integrity": "sha512-k3gZSnvV/BT3VbwDTILTnKytBn6sOzaHBAjV6/B4veX++PJnpC79hu310lfk0wkDSvRp47Ku1NTUaYegqWzJ9Q==", + "node_modules/p-limit": { + "version": "2.3.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "collection-utils": "^1.0.1", - "graphql": "^0.11.7", - "quicktype-core": "23.1.1" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/quicktype-typescript-input": { - "version": "23.1.1", - "resolved": "https://registry.npmjs.org/quicktype-typescript-input/-/quicktype-typescript-input-23.1.1.tgz", - "integrity": "sha512-cT51nPMWlSxCq3WSsIFxx14uflntAKUxWB0GWr3XZ/TAF4HtmS7hPI6gEa+bpJtEfcrKZwsTxWfl9jnv/f3OMA==", + "node_modules/p-locate": { + "version": "4.1.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@mark.probst/typescript-json-schema": "0.55.0", - "quicktype-core": "23.1.1", - "typescript": "4.9.5" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/quicktype-typescript-input/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "node_modules/p-map": { + "version": "7.0.3", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "engines": { + "node": ">=18" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4.2.0" + "node": ">=6" } }, - "node_modules/quicktype/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "node_modules/pac-proxy-agent": { + "version": "7.2.0", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { - "node": ">=4.2.0" + "node": ">= 14" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "0.2.11", + "dev": true, "license": "MIT", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "quansync": "^0.2.7" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/pako": { + "version": "1.0.11", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", + "node_modules/parse-asn1": { + "version": "5.1.7", + "license": "ISC", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "hash-base": "~3.0", + "pbkdf2": "^3.1.2", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.10" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/parse-entities": { + "version": "4.0.2", "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/parseurl": { + "version": "1.3.3", "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/path-equal": { + "version": "1.2.5", "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "loose-envify": "^1.1.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=0.10.0" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.2", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.3", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" }, - "peerDependencies": { - "react": "^18.3.1" + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" } }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "node_modules/picomatch": { + "version": "4.0.2", + "dev": true, "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/react-refresh": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.16.0.tgz", - "integrity": "sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/react-remove-scroll": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz", - "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==", + "node_modules/pirates": { + "version": "4.0.7", "dev": true, "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "node_modules/pkce-challenge": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" + "find-up": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=8" } }, - "node_modules/react-router": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", - "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", - "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", + "node_modules/pluralize": { + "version": "8.0.0", "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - "set-cookie-parser": "^2.6.0" - }, "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } + "node": ">=4" } }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "node_modules/possible-typed-array-names": { + "version": "1.1.0", "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/react-simple-code-editor": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.14.1.tgz", - "integrity": "sha512-BR5DtNRy+AswWJECyA17qhUDvrrCZ6zXOCfkQY5zSmb96BVUbpVAv03WpcjcwtCwiLbIANx3gebHOcXYn1EHow==", + "node_modules/postcss": { + "version": "8.5.3", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "node_modules/postcss-load-config": { + "version": "6.0.1", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" + "lilconfig": "^3.1.1" }, "engines": { - "node": ">=10" + "node": ">= 18" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "@types/react": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/read-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/presentable-error": { + "version": "0.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "node": ">=16" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "node_modules/prettier": { + "version": "3.6.2", "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "node_modules/pretty-format": { + "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "dev": true, "license": "MIT" }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "node_modules/prismjs": { + "version": "1.30.0", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, + "node_modules/process": { + "version": "0.11.10", "license": "MIT", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { - "rc": "^1.0.1" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/remark-breaks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-4.0.0.tgz", - "integrity": "sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==", + "node_modules/prop-types": { + "version": "15.8.1", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-newline-to-break": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "dev": true, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.0.0", "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "node_modules/proxy-addr": { + "version": "2.0.7", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.10" } }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "node_modules/proxy-agent": { + "version": "6.5.0", + "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 14" } }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.2", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", + "node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/quansync": { + "version": "0.2.10", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quicktype": { + "version": "23.1.1", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "workspaces": [ + "./packages/quicktype-core", + "./packages/quicktype-graphql-input", + "./packages/quicktype-typescript-input", + "./packages/quicktype-vscode" + ], "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@glideapps/ts-necessities": "^2.2.3", + "chalk": "^4.1.2", + "collection-utils": "^1.0.1", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "cross-fetch": "^4.0.0", + "graphql": "^0.11.7", + "lodash": "^4.17.21", + "moment": "^2.30.1", + "quicktype-core": "23.1.1", + "quicktype-graphql-input": "23.1.1", + "quicktype-typescript-input": "23.1.1", + "readable-stream": "^4.5.2", + "stream-json": "1.8.0", + "string-to-stream": "^3.0.1", + "typescript": "4.9.5" }, "bin": { - "resolve": "bin/resolve" + "quicktype": "dist/index.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.12.0" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/quicktype-core": { + "version": "23.1.1", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "@glideapps/ts-necessities": "2.2.3", + "browser-or-node": "^3.0.0", + "collection-utils": "^1.0.1", + "cross-fetch": "^4.0.0", + "is-url": "^1.2.4", + "js-base64": "^3.7.7", + "lodash": "^4.17.21", + "pako": "^1.0.6", + "pluralize": "^8.0.0", + "readable-stream": "4.5.2", + "unicode-properties": "^1.4.1", + "urijs": "^1.19.1", + "wordwrap": "^1.0.0", + "yaml": "^2.4.1" } }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "node_modules/quicktype-core/node_modules/@glideapps/ts-necessities": { + "version": "2.2.3", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/quicktype-core/node_modules/readable-stream": { + "version": "4.5.2", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/quicktype-graphql-input": { + "version": "23.1.1", "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "license": "Apache-2.0", + "dependencies": { + "collection-utils": "^1.0.1", + "graphql": "^0.11.7", + "quicktype-core": "23.1.1" } }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "node_modules/quicktype-typescript-input": { + "version": "23.1.1", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@mark.probst/typescript-json-schema": "0.55.0", + "quicktype-core": "23.1.1", + "typescript": "4.9.5" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "node_modules/quicktype-typescript-input/node_modules/typescript": { + "version": "4.9.5", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, + "license": "Apache-2.0", "bin": { - "glob": "dist/esm/bin.mjs" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4.2.0" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "node_modules/quicktype/node_modules/typescript": { + "version": "4.9.5", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", - "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", - "license": "MIT", - "dependencies": { - "hash-base": "^3.1.2", - "inherits": "^2.0.4" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ripemd160/node_modules/hash-base": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", - "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.1" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.8" + "node": ">=4.2.0" } }, - "node_modules/ripemd160/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/randombytes": { + "version": "2.1.0", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "safe-buffer": "^5.1.0" } }, - "node_modules/ripemd160/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/ripemd160/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/randomfill": { + "version": "1.0.4", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "node_modules/ripemd160/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", - "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.1", - "@rollup/rollup-android-arm64": "4.40.1", - "@rollup/rollup-darwin-arm64": "4.40.1", - "@rollup/rollup-darwin-x64": "4.40.1", - "@rollup/rollup-freebsd-arm64": "4.40.1", - "@rollup/rollup-freebsd-x64": "4.40.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", - "@rollup/rollup-linux-arm-musleabihf": "4.40.1", - "@rollup/rollup-linux-arm64-gnu": "4.40.1", - "@rollup/rollup-linux-arm64-musl": "4.40.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-musl": "4.40.1", - "@rollup/rollup-linux-s390x-gnu": "4.40.1", - "@rollup/rollup-linux-x64-gnu": "4.40.1", - "@rollup/rollup-linux-x64-musl": "4.40.1", - "@rollup/rollup-win32-arm64-msvc": "4.40.1", - "@rollup/rollup-win32-ia32-msvc": "4.40.1", - "@rollup/rollup-win32-x64-msvc": "4.40.1", - "fsevents": "~2.3.2" + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "node_modules/raw-body": { + "version": "3.0.2", "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 0.10" } }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/rsa-pem-from-mod-exp": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.6.tgz", - "integrity": "sha512-c5ouQkOvGHF1qomUUDJGFcXsomeSO2gbEs6hVhMAtlkE1CuaZase/WzoaKFG/EZQuNmq6pw/EMCeEnDvOgCJYQ==", - "license": "MIT" - }, - "node_modules/rtl-css-js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", - "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "license": "MIT", + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=18" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">= 0.8" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/rc": { + "version": "1.2.8", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "queue-microtask": "^1.2.2" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, + "node_modules/react": { + "version": "18.3.1", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=0.4" + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "react": "^18.3.1" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, + "node_modules/react-markdown": { + "version": "10.1.0", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" } }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "node_modules/react-refresh": { + "version": "0.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", "dev": true, "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, "engines": { "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "node_modules/react-router": { + "version": "7.12.0", "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } } }, - "node_modules/send": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", - "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", "license": "MIT", - "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" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/react-simple-code-editor": { + "version": "0.14.1", + "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/react-style-singleton": { + "version": "2.2.3", + "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "dev": true, - "license": "MIT", + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "node_modules/serve-handler/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/serve-handler/node_modules/bytes": { + "node_modules/read-yaml-file/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/serve-handler/node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "node_modules/readable-stream": { + "version": "4.7.0", "dev": true, "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "node_modules/readdirp": { + "version": "3.6.0", "dev": true, "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8.10.0" } }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/reflect-metadata": { + "version": "0.2.2", + "license": "Apache-2.0" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "dev": true, + "node_modules/regenerator-runtime": { + "version": "0.14.1", "license": "MIT" }, - "node_modules/serve-handler/node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/registry-auth-token": { + "version": "3.3.2", + "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/registry-url": { + "version": "3.1.0", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-static/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/remark-breaks": { + "version": "4.0.0", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-newline-to-break": "^2.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/serve-static/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/remark-gfm": { + "version": "4.0.1", + "dev": true, "license": "MIT", "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" + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/remark-parse": { + "version": "11.0.0", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/remark-rehype": { + "version": "11.1.2", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/remark-stringify": { + "version": "11.0.0", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, + "node_modules/require-directory": { + "version": "2.1.1", "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", + "node_modules/resolve": { + "version": "1.22.10", + "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "sha.js": "bin.js" + "resolve": "bin/resolve" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "dev": true, + "license": "ISC", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">= 0.4" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", + "node_modules/rimraf/node_modules/glob": { + "version": "11.1.0", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">= 0.4" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.1.1", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "semver": "^7.5.3" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" + "node_modules/ripemd160": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/rollup": { + "version": "4.40.1", "dev": true, "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.1", + "@rollup/rollup-android-arm64": "4.40.1", + "@rollup/rollup-darwin-arm64": "4.40.1", + "@rollup/rollup-darwin-x64": "4.40.1", + "@rollup/rollup-freebsd-arm64": "4.40.1", + "@rollup/rollup-freebsd-x64": "4.40.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", + "@rollup/rollup-linux-arm-musleabihf": "4.40.1", + "@rollup/rollup-linux-arm64-gnu": "4.40.1", + "@rollup/rollup-linux-arm64-musl": "4.40.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-musl": "4.40.1", + "@rollup/rollup-linux-s390x-gnu": "4.40.1", + "@rollup/rollup-linux-x64-gnu": "4.40.1", + "@rollup/rollup-linux-x64-musl": "4.40.1", + "@rollup/rollup-win32-arm64-msvc": "4.40.1", + "@rollup/rollup-win32-ia32-msvc": "4.40.1", + "@rollup/rollup-win32-x64-msvc": "4.40.1", + "fsevents": "~2.3.2" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, + "node_modules/router": { + "version": "2.2.0", "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">= 18" } }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "dev": true, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, + "node_modules/rsa-pem-from-mod-exp": { + "version": "0.8.6", + "license": "MIT" + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" + "@babel/runtime": "^7.1.2" } }, - "node_modules/sort-keys": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.1.0.tgz", - "integrity": "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==", + "node_modules/run-applescript": { + "version": "7.0.0", "license": "MIT", - "dependencies": { - "is-plain-obj": "^4.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/run-async": { + "version": "2.4.1", "dev": true, "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node": ">=0.12.0" } }, - "node_modules/spawn-rx": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-5.1.2.tgz", - "integrity": "sha512-/y7tJKALVZ1lPzeZZB9jYnmtrL7d0N2zkorii5a7r7dhHkWIuLTzZpZzMJLK1dmYRgX/NCc4iarTO3F7BS2c/A==", + "node_modules/run-parallel": { + "version": "1.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "debug": "^4.3.7", - "rxjs": "^7.8.1" + "queue-microtask": "^1.2.2" } }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", + "node_modules/rxjs": { + "version": "7.8.2", "dev": true, - "license": "SEE LICENSE IN LICENSE", + "license": "Apache-2.0", "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" + "tslib": "^2.1.0" } }, - "node_modules/spawndamnit/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/safe-array-concat": { + "version": "1.1.3", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=14" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/safe-push-apply": { + "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/safe-regex-test": { + "version": "1.1.0", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.0", "license": "MIT", + "peer": true, "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" + "loose-envify": "^1.1.0" } }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "node_modules/semver": { + "version": "7.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" + "node": ">=10" } }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/send": { + "version": "0.19.1", "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-json": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.8.0.tgz", - "integrity": "sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" + "node": ">= 0.8.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "ms": "2.0.0" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/string-to-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-3.0.1.tgz", - "integrity": "sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==", + "node_modules/serve-handler": { + "version": "6.1.6", "dev": true, "license": "MIT", "dependencies": { - "readable-stream": "^3.4.0" + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "3.3.0", + "range-parser": "1.2.0" } }, - "node_modules/string-to-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/serve-handler/node_modules/bytes": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/serve-handler/node_modules/content-disposition": { + "version": "0.5.2", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "mime-db": "~1.33.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "3.3.0", + "dev": true, + "license": "MIT" }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/serve-static": { + "version": "1.16.2", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/strip-final-newline": { + "node_modules/serve-static/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, + "node_modules/serve-static/node_modules/mime": { + "version": "1.6.0", "license": "MIT", - "engines": { - "node": ">=8" + "bin": { + "mime": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "node_modules/serve-static/node_modules/send": { + "version": "0.19.0", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.2" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "node_modules/set-cookie-parser": { + "version": "2.7.1", "license": "MIT" }, - "node_modules/style-to-js": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", - "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.8" - } - }, - "node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "node_modules/set-function-length": { + "version": "1.2.2", "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.4" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "node_modules/set-function-name": { + "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" } }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/set-proto": { + "version": "1.0.0", "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">= 6" + "node": ">= 0.4" } }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { - "glob": "dist/esm/bin.mjs" + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sucrase/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "shebang-regex": "^3.0.0" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">=8" } }, - "node_modules/sucrase/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/sucrase/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/shell-quote": { + "version": "1.8.3", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/superagent": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", - "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", - "dev": true, + "node_modules/side-channel": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^3.5.1", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=14.18.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supertest": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.0.tgz", - "integrity": "sha512-5QeSO8hSrKghtcWEoPiO036fxH0Ii2wVQfFZSP0oqQhmjk8bOLhDFXr4JrvaFmPuEWUoq4znY3uSi8UzLKxGqw==", - "dev": true, + "node_modules/side-channel-list": { + "version": "1.0.0", "license": "MIT", "dependencies": { - "methods": "^1.1.2", - "superagent": "^9.0.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=14.18.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "node_modules/side-channel-map": { + "version": "1.0.1", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, "engines": { "node": ">= 0.4" }, @@ -20873,842 +17148,612 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/table-layout": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { - "array-back": "^6.2.2", - "wordwrapjs": "^5.1.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=12.17" + "node": ">=10" } }, - "node_modules/table-layout/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "node_modules/sisteransi": { + "version": "1.0.5", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/tabster": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/tabster/-/tabster-8.5.4.tgz", - "integrity": "sha512-5Fe8vonlp6wjkBuaU3YImZsFncXkdxhCIE6CR28nD0n84kZERIDr9T9wBeya5h1Oj19AhzGFWyZrL6/29tCobA==", - "license": "MIT", - "dependencies": { - "keyborg": "2.6.0", - "tslib": "^2.3.1" - } + "license": "MIT" }, - "node_modules/tailwind-merge": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", - "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", + "node_modules/slash": { + "version": "3.0.0", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" + "engines": { + "node": ">=8" } }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "node_modules/smart-buffer": { + "version": "4.2.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/socks": { + "version": "2.8.4", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=8" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/socks-proxy-agent": { + "version": "8.0.5", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/sort-keys": { + "version": "5.1.0", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/source-map-support": { + "version": "0.5.13", "dev": true, "license": "MIT", "dependencies": { - "any-promise": "^1.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.8" + "node": ">=0.10.0" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "node_modules/spawn-rx": { + "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "debug": "^4.3.7", + "rxjs": "^7.8.1" } }, - "node_modules/tinygradient": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/tinygradient/-/tinygradient-1.1.5.tgz", - "integrity": "sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==", + "node_modules/spawndamnit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", + "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", "dev": true, - "license": "MIT", + "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@types/tinycolor2": "^1.4.0", - "tinycolor2": "^1.0.0" + "cross-spawn": "^7.0.5", + "signal-exit": "^4.0.1" } }, - "node_modules/title-case": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-4.3.2.tgz", - "integrity": "sha512-I/nkcBo73mO42Idfv08jhInV61IMb61OdIFxk+B4Gu1oBjWBPOLmhZdsli+oJCVaD+86pYQA93cJfFt224ZFAA==", + "node_modules/spawndamnit/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "node_modules/sprintf-js": { + "version": "1.0.3", "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, "license": "MIT", "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">=8" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/statuses": { + "version": "2.0.1", "license": "MIT", "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" + "node": ">= 0.8" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "node_modules/stream-browserify": { + "version": "3.0.0", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } + "node_modules/stream-chain": { + "version": "2.2.5", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "node_modules/stream-http": { + "version": "3.2.0", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" } }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.2", "license": "MIT", - "engines": { - "node": ">=18.12" + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, - "peerDependencies": { - "typescript": ">=4.8.4" + "engines": { + "node": ">= 6" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/ts-jest": { - "version": "29.3.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz", - "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", + "node_modules/stream-json": { + "version": "1.8.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.1", - "type-fest": "^4.39.1", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, + "stream-chain": "^2.2.5" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", - "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", + "node_modules/string-length": { + "version": "4.0.2", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/string-to-stream": { + "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "readable-stream": "^3.4.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/string-to-stream/node_modules/readable-stream": { + "version": "3.6.2", "dev": true, "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, + "node_modules/string-width": { + "version": "4.2.3", "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.4.0.tgz", - "integrity": "sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", "dev": true, "license": "MIT", "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^6.7.14", - "chokidar": "^4.0.3", - "consola": "^3.4.0", - "debug": "^4.4.0", - "esbuild": "^0.25.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.34.8", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.11", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tsup/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 0.4" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tsup/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">= 14.18.0" + "node": ">= 0.4" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/stringify-entities": { + "version": "4.0.4", + "license": "MIT", "dependencies": { - "whatwg-url": "^7.0.0" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, - "engines": { - "node": ">= 8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tsup/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, + "node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tsup/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/tsup/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/strip-bom": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "engines": { + "node": ">=8" } }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "node_modules/strip-final-newline": { + "version": "2.0.0", "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=6" } }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/turbo": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.5.2.tgz", - "integrity": "sha512-Qo5lfuStr6LQh3sPQl7kIi243bGU4aHGDQJUf6ylAdGwks30jJFloc9NYHP7Y373+gGU9OS0faA4Mb5Sy8X9Xw==", - "dev": true, + "node_modules/strip-outer": { + "version": "1.0.1", "license": "MIT", - "bin": { - "turbo": "bin/turbo" + "dependencies": { + "escape-string-regexp": "^1.0.2" }, - "optionalDependencies": { - "turbo-darwin-64": "2.5.2", - "turbo-darwin-arm64": "2.5.2", - "turbo-linux-64": "2.5.2", - "turbo-linux-arm64": "2.5.2", - "turbo-windows-64": "2.5.2", - "turbo-windows-arm64": "2.5.2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/turbo-darwin-64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.5.2.tgz", - "integrity": "sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/turbo-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "node_modules/style-mod": { + "version": "4.1.2", + "license": "MIT" }, - "node_modules/turbo-linux-64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.5.2.tgz", - "integrity": "sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/style-to-js": { + "version": "1.1.16", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "style-to-object": "1.0.8" + } }, - "node_modules/turbo-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.5.2.tgz", - "integrity": "sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/style-to-object": { + "version": "1.0.8", "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "inline-style-parser": "0.2.4" + } }, - "node_modules/turbo-windows-64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.5.2.tgz", - "integrity": "sha512-hOLcbgZzE5ttACHHyc1ajmWYq4zKT42IC3G6XqgiXxMbS+4eyVYTL+7UvCZBd3Kca1u4TLQdLQjeO76zyDJc2A==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } }, - "node_modules/turbo-windows-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.5.2.tgz", - "integrity": "sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "node_modules/stylis": { + "version": "4.3.6", + "license": "MIT" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/sucrase": { + "version": "3.35.0", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/sucrase/node_modules/glob": { + "version": "10.5.0", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", + "node_modules/sucrase/node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", + "node_modules/sucrase/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/sucrase/node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "node_modules/superagent": { + "version": "9.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.18.0" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/supertest": { + "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "methods": "^1.1.2", + "superagent": "^9.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.18.0" } }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "has-flag": "^4.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -21716,938 +17761,769 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/table-layout": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" }, "engines": { - "node": ">=14.17" + "node": ">=12.17" } }, - "node_modules/typescript-eslint": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", - "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.1", - "@typescript-eslint/parser": "8.31.1", - "@typescript-eslint/utils": "8.31.1" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, + "node": ">=12.17" + } + }, + "node_modules/tabster": { + "version": "8.5.4", + "license": "MIT", + "dependencies": { + "keyborg": "2.6.0", + "tslib": "^2.3.1" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "dev": true, + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "type": "github", + "url": "https://github.com/sponsors/dcastil" } }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "node_modules/term-size": { + "version": "2.2.1", "dev": true, "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "node_modules/thenify": { + "version": "3.3.1", "dev": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" + "any-promise": "^1.0.0" } }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "node_modules/thenify-all": { + "version": "1.6.0", "dev": true, "license": "MIT", "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "node_modules/through": { + "version": "2.3.8", "dev": true, "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "node_modules/tiny-inflate": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=18" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "node_modules/tinygradient": { + "version": "1.1.5", + "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@types/tinycolor2": "^1.4.0", + "tinycolor2": "^1.0.0" } }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "node_modules/title-case": { + "version": "4.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-buffer": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0" + "is-number": "^7.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.0" } }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "node_modules/toidentifier": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=0.6" } }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/touch": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" } }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "tree-kill": "cli.js" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, + "node_modules/trim-lines": { + "version": "3.0.1", "license": "MIT", - "engines": { - "node": ">= 4.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/unpipe": { + "node_modules/trim-repeated": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/update-check": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", - "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", - "dev": true, + "node_modules/trough": { + "version": "2.2.0", "license": "MIT", - "dependencies": { - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/ts-api-utils": { + "version": "2.1.0", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/uri-js-replace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", - "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", - "license": "MIT" - }, - "node_modules/urijs": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", + "node_modules/ts-interface-checker": { + "version": "0.1.13", "dev": true, - "license": "MIT" + "license": "Apache-2.0" }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "node_modules/ts-jest": { + "version": "29.3.2", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.0" + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.1", + "type-fest": "^4.39.1", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { - "@types/react": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { "optional": true } } }, - "node_modules/use-disposable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/use-disposable/-/use-disposable-1.0.4.tgz", - "integrity": "sha512-j83t6AMLWUyb5zwlTDqf6dP9LezM9R0yTbI/b6olmdaGtCKQUe9pgJWV6dRaaQLcozypjIEp4EmZr2DkZGKLSg==", - "license": "MIT", - "peerDependencies": { - "@types/react": ">=16.8.0 <19.0.0", - "@types/react-dom": ">=16.8.0 <19.0.0", - "react": ">=16.8.0 <19.0.0", - "react-dom": ">=16.8.0 <19.0.0" + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.40.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "node_modules/ts-node": { + "version": "10.9.2", "dev": true, "license": "MIT", "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "engines": { - "node": ">=10" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" }, "peerDependenciesMeta": { - "@types/react": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { "optional": true } } }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "node_modules/tsconfig-paths": { + "version": "3.15.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "license": "MIT", "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" + "minimist": "^1.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/tsup": { + "version": "8.4.0", "dev": true, "license": "MIT", "dependencies": { + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" }, "bin": { - "vite": "bin/vite.js" + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "node": ">=18" }, "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" + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" }, "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": { + "@microsoft/api-extractor": { "optional": true }, - "terser": { + "@swc/core": { "optional": true }, - "tsx": { + "postcss": { "optional": true }, - "yaml": { + "typescript": { "optional": true } } }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "node_modules/tsup/node_modules/chokidar": { + "version": "4.0.3", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "makeerror": "1.0.12" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/tsup/node_modules/readdirp": { + "version": "4.1.2", "dev": true, "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "defaults": "^1.0.3" + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "node_modules/tsup/node_modules/tr46": { + "version": "1.0.1", + "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 14" + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "node_modules/tsup/node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, "license": "BSD-2-Clause" }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/tsup/node_modules/whatwg-url": { + "version": "7.1.0", + "dev": true, "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", + "node_modules/tsx": { + "version": "4.20.6", + "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" }, "bin": { - "node-which": "bin/node-which" + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">= 8" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, + "node_modules/tunnel": { + "version": "0.0.6", "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "node_modules/turbo": { + "version": "2.5.2", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" + "bin": { + "turbo": "bin/turbo" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "turbo-darwin-64": "2.5.2", + "turbo-darwin-arm64": "2.5.2", + "turbo-linux-64": "2.5.2", + "turbo-linux-arm64": "2.5.2", + "turbo-windows-64": "2.5.2", + "turbo-windows-arm64": "2.5.2" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "node_modules/turbo-darwin-arm64": { + "version": "2.5.2", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/type-detect": { + "version": "4.0.8", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" - }, - "node_modules/wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "node_modules/type-fest": { + "version": "0.21.3", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12.17" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, + "node_modules/type-is": { + "version": "1.6.18", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "node_modules/typed-array-buffer": { + "version": "1.0.3", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "node_modules/typed-array-byte-length": { + "version": "1.0.3", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wsl-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { - "is-wsl": "^3.1.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { - "node": ">=4.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", + "node_modules/typescript": { + "version": "5.8.3", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=4.0" + "node": ">=14.17" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/typescript-eslint": { + "version": "8.31.1", + "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" + }, "engines": { - "node": ">=0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", + "node_modules/typical": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "license": "ISC", + "node_modules/uglify-js": { + "version": "3.19.3", + "license": "BSD-2-Clause", + "optional": true, "bin": { - "yaml": "bin.mjs" + "uglifyjs": "bin/uglifyjs" }, "engines": { - "node": ">= 14" + "node": ">=0.8.0" } }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "license": "Apache-2.0" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } + "node_modules/undefsafe": { + "version": "2.0.5", + "dev": true, + "license": "MIT" }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/undici-types": { + "version": "6.21.0", + "license": "MIT" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/unicode-trie": { + "version": "2.0.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" } }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", "dev": true, "license": "MIT", "engines": { @@ -22657,1076 +18533,1043 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "node_modules/unified": { + "version": "11.0.5", "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", - "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/zod-validation-error": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.4.0.tgz", - "integrity": "sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==", - "dev": true, + "node_modules/unist-util-is": { + "version": "6.0.0", "license": "MIT", - "engines": { - "node": ">=18.0.0" + "dependencies": { + "@types/unist": "^3.0.0" }, - "peerDependencies": { - "zod": "^3.18.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/zustand": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz", - "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==", + "node_modules/unist-util-position": { + "version": "5.0.0", "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" + "dependencies": { + "@types/unist": "^3.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "packages/ai": { - "name": "@microsoft/teams.ai", - "version": "2.0.5", + "node_modules/unist-util-visit": { + "version": "5.0.0", "license": "MIT", - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "@types/node": "^22.0.2", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" - }, - "engines": { - "node": ">=20" + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "peerDependencies": { - "@microsoft/teams.common": "2.0.5" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "packages/api": { - "name": "@microsoft/teams.api", - "version": "2.0.5", + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", "license": "MIT", "dependencies": { - "jwt-decode": "^4.0.0", - "qs": "^6.14.1" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "@types/jsonwebtoken": "^9.0.7", - "@types/qs": "^6.9.15", - "jest": "^29.7.0", - "jsonwebtoken": "^9.0.2", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" - }, - "engines": { - "node": ">=20" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, - "peerDependencies": { - "@microsoft/teams.cards": "2.0.5", - "@microsoft/teams.common": "2.0.5" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "packages/apps": { - "name": "@microsoft/teams.apps", - "version": "2.0.5", + "node_modules/universalify": { + "version": "0.1.2", + "dev": true, "license": "MIT", - "dependencies": { - "@azure/msal-node": "^3.8.1", - "axios": "^1.12.0", - "cors": "^2.8.5", - "express": "^4.22.0", - "jsonwebtoken": "^9.0.2", - "jwks-rsa": "^3.2.0", - "reflect-metadata": "^0.2.2" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/cors": "^2.8.17", - "@types/express": "^5.0.0", - "@types/jest": "^29.5.12", - "@types/node": "^22.0.2", - "@types/supertest": "^6.0.2", - "cross-env": "^7.0.3", - "jest": "^29.7.0", - "jsonwebtoken": "^9.0.2", - "quicktype": "^23.0.171", - "rimraf": "^6.0.1", - "supertest": "^7.0.0", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" - }, "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "@microsoft/teams.graph": "2.0.5" + "node": ">= 4.0.0" } }, - "packages/apps/node_modules/@azure/msal-common": { - "version": "15.13.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.1.tgz", - "integrity": "sha512-vQYQcG4J43UWgo1lj7LcmdsGUKWYo28RfEvDQAEMmQIMjSFufvb+pS0FJ3KXmrPmnWlt1vHDl3oip6mIDUQ4uA==", + "node_modules/unpipe": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.8" } }, - "packages/apps/node_modules/@azure/msal-node": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.1.tgz", - "integrity": "sha512-HszfqoC+i2C9+BRDQfuNUGp15Re7menIhCEbFCQ49D3KaqEDrgZIgQ8zSct4T59jWeUIL9N/Dwiv4o2VueTdqQ==", + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@azure/msal-common": "15.13.1", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">=16" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "packages/apps/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/update-check": { + "version": "1.5.4", + "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" } }, - "packages/apps/node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", "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" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "punycode": "^2.1.0" } }, - "packages/apps/node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/uri-js-replace": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/urijs": { + "version": "1.19.11", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "dev": true, "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "tslib": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "packages/apps/node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/use-disposable": { + "version": "1.0.4", "license": "MIT", - "engines": { - "node": ">= 0.8" + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "@types/react-dom": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0", + "react-dom": ">=16.8.0 <19.0.0" } }, - "packages/apps/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/use-sidecar": { + "version": "1.1.3", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "packages/apps/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "packages/apps/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/use-sync-external-store": { + "version": "1.5.0", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "packages/apps/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/util-deprecate": { + "version": "1.0.2", "license": "MIT" }, - "packages/apps/node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "node_modules/utils-merge": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "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.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.4.0" } }, - "packages/apps/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "node_modules/uuid": { + "version": "11.1.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", "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.1", - "unpipe": "~1.0.0" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10.12.0" } }, - "packages/apps/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "packages/apps/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/vary": { + "version": "1.1.2", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "packages/apps/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "node_modules/vfile": { + "version": "6.0.3", "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "packages/apps/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/vfile-message": { + "version": "4.0.2", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "packages/apps/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/vite": { + "version": "6.4.1", + "dev": true, "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">= 0.6" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=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 + } + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" } }, - "packages/apps/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" + "defaults": "^1.0.3" } }, - "packages/apps/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">= 14" } }, - "packages/apps/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" }, - "packages/apps/node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "node_modules/whatwg-url": { + "version": "5.0.0", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">= 0.8" + "node": ">= 8" } }, - "packages/apps/node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "packages/apps/node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "url": "https://github.com/sponsors/ljharb" } }, - "packages/apps/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, "license": "MIT", "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" + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "packages/apps/node_modules/send/node_modules/encodeurl": { + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "packages/apps/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/which-typed-array": { + "version": "1.1.19", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "packages/apps/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "packages/apps/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/wordwrap": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/wordwrapjs": { + "version": "5.1.0", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=12.17" } }, - "packages/auth": { - "name": "@microsoft/teams.auth", - "version": "2.0.0-preview.6", - "extraneous": true, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, "license": "MIT", "dependencies": { - "@microsoft/teams.common": "2.0.0-preview.6", - "jsonwebtoken": "^9.0.2", - "jwks-rsa": "^3.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "devDependencies": { - "@microsoft/teams.config": "*", - "@types/jest": "^29.5.12", - "@types/jsonwebtoken": "^9.0.6", - "@types/node": "^22.0.2", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "typescript": "^5.4.5" + "engines": { + "node": ">=8" } }, - "packages/botbuilder": { - "name": "@microsoft/teams.botbuilder", - "version": "2.0.5", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, "license": "MIT", - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "@types/node": "^22.0.2", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=20" + "node": ">=10" }, - "peerDependencies": { - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.apps": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "@microsoft/teams.graph": "2.0.5", - "botbuilder": "4.23.1" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "packages/cards": { - "name": "@microsoft/teams.cards", - "version": "2.0.5", - "license": "MIT", - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, "engines": { - "node": ">=20" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "packages/cli": { - "name": "@microsoft/teams.cli", - "version": "2.0.5", + "node_modules/ws": { + "version": "8.18.1", "license": "MIT", - "dependencies": { - "@microsoft/teams.common": "2.0.5", - "change-case": "^5.4.4", - "handlebars": "^4.7.8", - "yaml": "^2.7.0", - "yargs": "^17.7.2", - "zod": "^3.24.2" - }, - "bin": { - "teams": "dist/index.js" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "@types/node": "^22.10.7", - "@types/yargs": "^17.0.33", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" - }, "engines": { - "node": ">=20" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "packages/client": { - "name": "@microsoft/teams.client", - "version": "2.0.5", + "node_modules/wsl-utils": { + "version": "0.1.0", "license": "MIT", "dependencies": { - "@azure/msal-browser": "^4.9.1", - "uuid": "^11.0.5" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=20" + "node": ">=18" }, - "peerDependencies": { - "@microsoft/teams-js": "^2.35.0", - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "@microsoft/teams.graph": "2.0.5" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/common": { - "name": "@microsoft/teams.common", - "version": "2.0.5", + "node_modules/xml2js": { + "version": "0.5.0", "license": "MIT", "dependencies": { - "axios": "^1.12.0" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/jest": "^29.5.12", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" }, "engines": { - "node": ">=20" + "node": ">=4.0.0" } }, - "packages/config": { - "name": "@microsoft/teams.config", - "version": "2.0.5", + "node_modules/xmlbuilder": { + "version": "11.0.1", "license": "MIT", - "devDependencies": { - "@eslint/js": "^9.25.1", - "@stylistic/eslint-plugin": "^4.2.0", - "eslint": "^9.25.1", - "eslint-plugin-import": "^2.31.0", - "typescript": "^5.4.5", - "typescript-eslint": "^8.26.0" + "engines": { + "node": ">=4.0" } }, - "packages/dev": { - "name": "@microsoft/teams.dev", - "version": "2.0.5", + "node_modules/xtend": { + "version": "4.0.2", "license": "MIT", - "dependencies": { - "axios": "^1.12.0", - "express": "^4.22.0", - "jsonwebtoken": "^9.0.2", - "uuid": "^11.0.5", - "ws": "^8.18.1" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/express": "^5.0.0", - "@types/jest": "^29.5.12", - "@types/jsonwebtoken": "^9.0.7", - "@types/node": "^22.5.5", - "@types/ws": "^8.18.1", - "jest": "^29.7.0", - "rimraf": "^6.0.1", - "ts-jest": "^29.2.5", - "tsup": "^8.4.0", - "typescript": "^5.4.5" - }, "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.apps": "2.0.5", - "@microsoft/teams.cards": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "@microsoft/teams.graph": "2.0.5" + "node": ">=0.4" } }, - "packages/dev/node_modules/@types/ws": { - "version": "8.18.1", + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.1", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" } }, - "packages/dev/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "packages/dev/node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "dev": true, "license": "MIT", - "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" - }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=6" } }, - "packages/dev/node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, "engines": { - "node": ">= 0.8" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/dev/node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/dev/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/zod": { + "version": "3.25.76", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.0", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-validation-error": { + "version": "3.4.0", + "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.18.0" } }, - "packages/dev/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "node_modules/zustand": { + "version": "5.0.3", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } }, - "packages/dev/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/zwitch": { + "version": "2.0.4", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "packages/dev/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "packages/dev/node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "packages/ai": { + "name": "@microsoft/teams.ai", + "version": "2.0.5", "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "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.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "@types/node": "^22.0.2", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">= 0.10.0" + "node": ">=20" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependencies": { + "@microsoft/teams.common": "2.0.5" } }, - "packages/dev/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "packages/api": { + "name": "@microsoft/teams.api", + "version": "2.0.5", "license": "MIT", "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.1", - "unpipe": "~1.0.0" + "jwt-decode": "^4.0.0", + "qs": "^6.14.1" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.7", + "@types/qs": "^6.9.15", + "jest": "^29.7.0", + "jsonwebtoken": "^9.0.2", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">= 0.8" + "node": ">=20" + }, + "peerDependencies": { + "@microsoft/teams.cards": "2.0.5", + "@microsoft/teams.common": "2.0.5" } }, - "packages/dev/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "packages/apps": { + "name": "@microsoft/teams.apps", + "version": "2.0.5", "license": "MIT", + "dependencies": { + "@azure/msal-node": "^3.8.1", + "axios": "^1.12.0", + "cors": "^2.8.5", + "express": "^4.22.0", + "jsonwebtoken": "^9.0.2", + "jwks-rsa": "^3.2.0", + "reflect-metadata": "^0.2.2" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/jest": "^29.5.12", + "@types/node": "^22.0.2", + "@types/supertest": "^6.0.2", + "cross-env": "^7.0.3", + "jest": "^29.7.0", + "jsonwebtoken": "^9.0.2", + "quicktype": "^23.0.171", + "rimraf": "^6.0.1", + "supertest": "^7.0.0", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" + }, "engines": { - "node": ">= 0.6" + "node": ">=20" + }, + "peerDependencies": { + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "@microsoft/teams.graph": "2.0.5" } }, - "packages/dev/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "packages/apps/node_modules/@azure/msal-common": { + "version": "15.13.1", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "packages/dev/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "packages/dev/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "packages/apps/node_modules/@azure/msal-node": { + "version": "3.8.1", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "@azure/msal-common": "15.13.1", + "jsonwebtoken": "^9.0.0", + "uuid": "^8.3.0" }, "engines": { - "node": ">=4" + "node": ">=16" } }, - "packages/dev/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "packages/apps/node_modules/uuid": { + "version": "8.3.2", "license": "MIT", - "engines": { - "node": ">= 0.6" + "bin": { + "uuid": "dist/bin/uuid" } }, - "packages/dev/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "packages/botbuilder": { + "name": "@microsoft/teams.botbuilder", + "version": "2.0.5", "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "@types/node": "^22.0.2", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">= 0.6" + "node": ">=20" + }, + "peerDependencies": { + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "@microsoft/teams.graph": "2.0.5", + "botbuilder": "4.23.1" } }, - "packages/dev/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "packages/cards": { + "name": "@microsoft/teams.cards", + "version": "2.0.5", "license": "MIT", + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" + }, "engines": { - "node": ">= 0.6" + "node": ">=20" } }, - "packages/dev/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "packages/dev/node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "packages/cli": { + "name": "@microsoft/teams.cli", + "version": "2.0.5", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" + "@microsoft/teams.common": "2.0.5", + "change-case": "^5.4.4", + "handlebars": "^4.7.8", + "yaml": "^2.7.0", + "yargs": "^17.7.2", + "zod": "^3.24.2" + }, + "bin": { + "teams": "dist/index.js" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "@types/node": "^22.10.7", + "@types/yargs": "^17.0.33", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">= 0.8" + "node": ">=20" } }, - "packages/dev/node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "packages/client": { + "name": "@microsoft/teams.client", + "version": "2.0.5", "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" + "@azure/msal-browser": "^4.9.1", + "uuid": "^11.0.5" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "packages/dev/node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=20" + }, + "peerDependencies": { + "@microsoft/teams-js": "^2.35.0", + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "@microsoft/teams.graph": "2.0.5" } }, - "packages/dev/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "packages/common": { + "name": "@microsoft/teams.common", + "version": "2.0.5", "license": "MIT", "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" + "axios": "^1.12.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">= 0.8.0" + "node": ">=20" } }, - "packages/dev/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "packages/config": { + "name": "@microsoft/teams.config", + "version": "2.0.5", "license": "MIT", - "engines": { - "node": ">= 0.8" + "devDependencies": { + "@eslint/js": "^9.25.1", + "@stylistic/eslint-plugin": "^4.2.0", + "eslint": "^9.25.1", + "eslint-plugin-import": "^2.31.0", + "typescript": "^5.4.5", + "typescript-eslint": "^8.26.0" } }, - "packages/dev/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "packages/dev": { + "name": "@microsoft/teams.dev", + "version": "2.0.5", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "axios": "^1.12.0", + "express": "^4.22.0", + "jsonwebtoken": "^9.0.2", + "uuid": "^11.0.5", + "ws": "^8.18.1" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/express": "^5.0.0", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.7", + "@types/node": "^22.5.5", + "@types/ws": "^8.18.1", + "jest": "^29.7.0", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "tsup": "^8.4.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">= 0.8.0" + "node": ">=20" + }, + "peerDependencies": { + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.cards": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "@microsoft/teams.graph": "2.0.5" } }, - "packages/dev/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "packages/dev/node_modules/@types/ws": { + "version": "8.18.1", + "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" + "@types/node": "*" } }, "packages/devtools": { @@ -23777,8 +19620,6 @@ }, "packages/devtools/node_modules/entities": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -23800,8 +19641,6 @@ }, "packages/devtools/node_modules/htmlparser2": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -23819,8 +19658,6 @@ }, "packages/devtools/node_modules/react": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -23828,8 +19665,6 @@ }, "packages/devtools/node_modules/react-dom": { "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -23840,8 +19675,6 @@ }, "packages/devtools/node_modules/scheduler": { "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "packages/devtools/node_modules/typescript": { @@ -23941,8 +19774,6 @@ }, "packages/graph-tools/node_modules/camelcase": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", "license": "MIT", "engines": { "node": ">=16" @@ -23976,312 +19807,6 @@ "@microsoft/teams.common": "2.0.5", "openai": "^4.55.0" } - }, - "tests/a2a": { - "name": "@tests/a2a", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@a2a-js/sdk": "^0.3.4", - "@microsoft/teams.a2a": "2.0.4", - "@microsoft/teams.ai": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.openai": "2.0.4" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/ai": { - "name": "@tests/ai", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.ai": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.openai": "2.0.4", - "fuse.js": "^7.1.0" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/auth": { - "name": "@tests/auth", - "version": "0.0.1-preview.2", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.0-preview.2", - "@microsoft/teams.apps": "2.0.0-preview.2", - "@microsoft/teams.cards": "2.0.0-preview.2", - "@microsoft/teams.common": "2.0.0-preview.2", - "@microsoft/teams.dev": "2.0.0-preview.2", - "@microsoft/teams.graph": "2.0.0-preview.2" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.0-preview.2", - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "env-cmd": "latest", - "nodemon": "^3.1.4", - "rimraf": "^6.0.1", - "ts-node": "^10.9.2", - "typescript": "^5.4.5" - } - }, - "tests/botbuilder": { - "name": "@tests/botbuilder", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.botbuilder": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4", - "botbuilder": "4.23.1" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@types/node": "^22.0.2", - "dotenv": "^16.4.5", - "rimraf": "^6.0.1", - "tsup": "^8.4.0", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/cards": { - "name": "@tests/cards", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.ai": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.dev": "2.0.4" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/dialogs": { - "name": "@tests/dialogs", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.ai": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.dev": "2.0.4" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "dotenv": "^16.5.0", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/echo": { - "name": "@tests/echo", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/graph": { - "name": "@tests/auth", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4", - "@microsoft/teams.graph-endpoints": "2.0.4" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/lights": { - "name": "@tests/lights", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.ai": "2.0.4", - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4", - "@microsoft/teams.openai": "2.0.4" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/mcp": { - "name": "@tests/mcp", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4", - "@microsoft/teams.mcp": "2.0.4", - "@microsoft/teams.openai": "2.0.4", - "@modelcontextprotocol/sdk": "^1.9.0", - "zod": "^3.24.3" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@modelcontextprotocol/inspector": "^0.16.5", - "@types/node": "^22.5.4", - "cross-env": "^7.0.3", - "dotenv": "^16.4.5", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/mcpclient": { - "name": "@tests/mcpclient", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.ai": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.mcpclient": "2.0.4", - "@microsoft/teams.openai": "2.0.4", - "@modelcontextprotocol/sdk": "^1.13.0" - }, - "devDependencies": { - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/message-extensions": { - "name": "@tests/message-extensions", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "env-cmd": "*", - "rimraf": "^6.0.1", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, - "tests/tab": { - "name": "@tests/tab", - "version": "0.0.5", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.4", - "@microsoft/teams.apps": "2.0.4", - "@microsoft/teams.cards": "2.0.4", - "@microsoft/teams.client": "2.0.4", - "@microsoft/teams.common": "2.0.4", - "@microsoft/teams.dev": "2.0.4", - "@microsoft/teams.graph": "2.0.4", - "@microsoft/teams.graph-endpoints": "2.0.4", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.4", - "@types/node": "^22.5.4", - "@vitejs/plugin-react": "^4.3.4", - "dotenv": "^16.4.5", - "nodemon": "^3.1.4", - "rimraf": "^6.0.1", - "tsup": "^8.4.0", - "typescript": "^5.4.5", - "vite": "^6.4.1" - } } } } diff --git a/packages/apps/src/plugins/http/adapter.ts b/packages/apps/src/plugins/http/adapter.ts new file mode 100644 index 000000000..5c4e66bb2 --- /dev/null +++ b/packages/apps/src/plugins/http/adapter.ts @@ -0,0 +1,63 @@ +import http from 'http'; + +/** + * Helpers provided to route handlers + */ +export interface IRequestHelpers { + /** + * Extract standardized request data from the framework request + */ + extractRequestData: () => { + body: any; + headers: Record; + }; + + /** + * Send standardized response using the framework response + */ + sendResponse: (response: { status: number; body: any }) => void; +} + +/** + * Configuration for registering a route with the adapter + */ +export interface IRouteConfig { + method: string; + path: string; + handler: (helpers: IRequestHelpers) => Promise; +} + +/** + * Adapter interface for different HTTP frameworks + * + * Adapters handle framework-specific HTTP concerns while ConfigurableHttpPlugin + * handles Teams protocol logic (JWT validation, activity processing, etc.) + */ +export interface IHttpAdapter { + /** + * Get the underlying HTTP server + * The adapter owns the server (creates it or accepts it from user) + */ + getServer(): http.Server; + + /** + * Register a route with the adapter + * The adapter handles framework-specific routing logic and provides helpers to the handler + * @param config Route configuration with method, path, and handler + */ + registerRoute(config: IRouteConfig): void; + + /** + * Optional: Framework-specific initialization + * Called during ConfigurableHttpPlugin.initialize() + * Example: Next.js needs nextApp.prepare() + */ + initialize?(): Promise; + + /** + * Optional: Start the server + * Called during ConfigurableHttpPlugin.start() + * Should throw error if server is user-provided + */ + start?(port: number): Promise; +} diff --git a/packages/apps/src/plugins/http/configurable-http-plugin.ts b/packages/apps/src/plugins/http/configurable-http-plugin.ts new file mode 100644 index 000000000..ede52e804 --- /dev/null +++ b/packages/apps/src/plugins/http/configurable-http-plugin.ts @@ -0,0 +1,216 @@ +import http from 'http'; + +import { + Credentials, + InvokeResponse, + IToken +} from '@microsoft/teams.api'; + +import { ILogger } from '@microsoft/teams.common'; + +import pkg from '../../../package.json'; +import { IActivityEvent, IErrorEvent } from '../../events'; +import { Manifest } from '../../manifest'; +import { + Dependency, + Event, + IPluginStartEvent, + Logger, + Plugin, +} from '../../types'; + +import { IHttpAdapter, IRequestHelpers } from './adapter'; + +/** + * Configurable HTTP plugin that works with different HTTP frameworks via adapters + * + * This plugin handles Teams protocol logic (JWT validation, activity processing) + * while delegating HTTP framework concerns to the adapter. + */ +@Plugin({ + name: 'http', + version: pkg.version, + description: 'Configurable HTTP plugin that works with different frameworks via adapters', +}) +export class ConfigurableHttpPlugin { + @Logger() + readonly logger!: ILogger; + + @Dependency() + readonly manifest!: Partial; + + @Dependency({ optional: true }) + readonly credentials?: Credentials; + + @Event('error') + readonly $onError!: (event: IErrorEvent) => void; + + @Event('activity') + readonly $onActivity!: (event: IActivityEvent) => Promise; + + get server() { + return this._server; + } + protected _server: http.Server; + + get port() { + return this._port; + } + protected _port?: number | string; + + private adapter: IHttpAdapter; + protected skipAuth: boolean; + protected initialized: boolean = false; + + constructor(adapter: IHttpAdapter, options?: { skipAuth?: boolean }) { + this.adapter = adapter; + this._server = adapter.getServer(); + this.skipAuth = options?.skipAuth ?? false; + } + + /** + * Ensure adapter is initialized (only runs once) + */ + protected async ensureInitialized() { + if (this.initialized) { + return; + } + + // Framework-specific initialization (e.g., Next.js prepare) + if (this.adapter.initialize) { + await this.adapter.initialize(); + } + + // Register Teams bot endpoint + this.adapter.registerRoute({ + method: 'post', + path: '/api/messages', + handler: async (helpers) => { + await this.handleActivity(helpers); + } + }); + + this.initialized = true; + } + + /** + * Initialize the plugin - called by App during initialization + * Sets up routes via the adapter + */ + async onInit() { + await this.ensureInitialized(); + } + + /** + * Start the plugin - called by App.start() + * Delegates to adapter's start method + */ + async onStart({ port }: IPluginStartEvent) { + await this.ensureInitialized(); + + this._port = port; + + // Delegate to adapter's start (may throw if user-provided server) + if (this.adapter.start) { + return await new Promise((resolve, reject) => { + this._server.on('error', (err) => { + this.$onError({ error: err }); + reject(err); + }); + + const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; + this.adapter.start!(portNumber).then(() => { + this.logger.info(`listening on port ${port} 🚀`); + resolve(); + }).catch(reject); + }); + } + } + + /** + * Stop the plugin - called by App.stop() + * Closes the server if we own it + */ + onStop() { + this._server.close(); + } + + /** + * Handle incoming activity + * Validates JWT, processes activity, sends response + */ + protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { + try { + // Extract data from request + const { body, headers } = extractRequestData(); + + // Validate JWT if not skipped + let token: IToken; + if (!this.skipAuth && this.credentials) { + // Validate JWT token + const authHeader = headers['authorization']; + if (!authHeader) { + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + + try { + token = await this.validateJwt(authHeader, body); + } catch (err) { + this.logger.error('JWT validation failed', err); + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + } else { + // Skip auth - create dummy token + token = { + appId: '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } + + // Process activity via App + const response = await this.$onActivity({ + body, + token, + }); + + // Send response + sendResponse({ + status: response.status || 200, + body: response.body + }); + } catch (err) { + this.logger.error('Error processing activity:', err); + sendResponse({ + status: 500, + body: { error: 'Internal server error' } + }); + } + } + + /** + * Validate JWT token + * Uses existing withJwtValidation middleware logic + */ + protected async validateJwt(_authHeader: string, body: any): Promise { + // TODO: Implement proper JWT validation using withJwtValidation middleware + // For now, return a basic token with credentials info + return { + appId: this.credentials?.clientId || '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } +} diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts new file mode 100644 index 000000000..ba606f28a --- /dev/null +++ b/packages/apps/src/plugins/http/express-adapter.ts @@ -0,0 +1,135 @@ +import http from 'http'; +import cors from 'cors'; +import express from 'express'; +import { IHttpAdapter, IRouteConfig } from './adapter'; + +/** + * Express adapter for ConfigurableHttpPlugin + * + * Handles Express-specific HTTP framework concerns: + * - Express app creation and middleware setup + * - Route registration via Express routing + * - Request/response data extraction and sending + * - Server lifecycle management + */ +export class ExpressAdapter implements IHttpAdapter { + protected express: express.Application; + protected server: http.Server; + protected isUserProvidedServer: boolean; + + // Expose Express methods for backwards compatibility + readonly get: express.Application['get']; + readonly post: express.Application['post']; + readonly patch: express.Application['patch']; + readonly put: express.Application['put']; + readonly delete: express.Application['delete']; + readonly route: express.Application['route']; + readonly use: express.Application['use']; + + constructor(server?: http.Server) { + this.isUserProvidedServer = !!server; + this.express = express(); + this.server = server || http.createServer(); + this.server.on('request', this.express); + + // Bind Express methods + this.get = this.express.get.bind(this.express); + this.post = this.express.post.bind(this.express); + this.patch = this.express.patch.bind(this.express); + this.put = this.express.put.bind(this.express); + this.delete = this.express.delete.bind(this.express); + this.route = this.express.route.bind(this.express); + this.use = this.express.use.bind(this.express); + + // Setup middleware + this.express.use(cors()); + this.express.use('/api*', express.json()); + } + + /** + * Get the underlying HTTP server + */ + getServer(): http.Server { + return this.server; + } + + /** + * Register a route with Express + */ + registerRoute(config: IRouteConfig): void { + const { method, path, handler } = config; + + // Convert handler to Express middleware signature + const expressHandler = async ( + req: express.Request, + res: express.Response, + next: express.NextFunction + ) => { + try { + // Provide helpers to the handler + await handler({ + extractRequestData: () => ({ + body: req.body, + headers: req.headers as Record + }), + sendResponse: (response) => { + res.status(response.status).send(response.body); + } + }); + } catch (err) { + next(err); + } + }; + + // Register with Express using the appropriate method + switch (method.toLowerCase()) { + case 'get': + this.express.get(path, expressHandler); + break; + case 'post': + this.express.post(path, expressHandler); + break; + case 'put': + this.express.put(path, expressHandler); + break; + case 'patch': + this.express.patch(path, expressHandler); + break; + case 'delete': + this.express.delete(path, expressHandler); + break; + default: + throw new Error(`Unsupported HTTP method: ${method}`); + } + } + + /** + * Start the server + * Throws if server was user-provided + */ + async start(port: number): Promise { + if (this.isUserProvidedServer) { + throw new Error( + 'Cannot call start() when server was provided by user. ' + + 'User should call server.listen() directly.' + ); + } + + return new Promise((resolve, reject) => { + this.server.listen(port, () => { + resolve(); + }); + this.server.once('error', reject); + }); + } + + /** + * Serve static files + * @param path the url path to serve + * @param dist the dist file path to serve + */ + static(path: string, dist: string): this { + this.express.use(path, express.static(dist)); + return this; + } +} diff --git a/packages/apps/src/plugins/http/index.ts b/packages/apps/src/plugins/http/index.ts index 1110b6451..2731db20d 100644 --- a/packages/apps/src/plugins/http/index.ts +++ b/packages/apps/src/plugins/http/index.ts @@ -1 +1,4 @@ export * from './plugin'; +export * from './configurable-http-plugin'; +export * from './adapter'; +export * from './express-adapter'; diff --git a/packages/apps/src/plugins/http/plugin.ts b/packages/apps/src/plugins/http/plugin.ts index 4227d8217..dddd97277 100644 --- a/packages/apps/src/plugins/http/plugin.ts +++ b/packages/apps/src/plugins/http/plugin.ts @@ -1,53 +1,29 @@ import http from 'http'; -import cors from 'cors'; import express from 'express'; -import { - Credentials, - InvokeResponse, - IToken -} from '@microsoft/teams.api'; - -import { ILogger } from '@microsoft/teams.common'; - import pkg from '../../../package.json'; -import { IActivityEvent, IErrorEvent } from '../../events'; -import { Manifest } from '../../manifest'; -import { JwtValidatedRequest, withJwtValidation } from '../../middleware/jwt-validation-middleware'; -import { - Dependency, - Event, - IPluginStartEvent, - Logger, - Plugin, -} from '../../types'; +import { Plugin } from '../../types'; + +import { ConfigurableHttpPlugin } from './configurable-http-plugin'; +import { ExpressAdapter } from './express-adapter'; /** - * Receives activities via HTTP - * Handles HTTP server setup, routing, and authentication + * Receives activities via HTTP using Express + * + * NOTE: This plugin is named "HttpPlugin" for historical reasons and backwards compatibility. + * It is the default HTTP plugin that uses Express as the underlying framework. + * + * This is a wrapper around ConfigurableHttpPlugin + ExpressAdapter for backwards compatibility. + * For other frameworks (Hono, Next.js, etc.), use ConfigurableHttpPlugin with the appropriate adapter. */ @Plugin({ name: 'http', version: pkg.version, description: 'the default plugin for receiving activities via HTTP', }) -export class HttpPlugin { - @Logger() - readonly logger!: ILogger; - - @Dependency() - readonly manifest!: Partial; - - @Dependency({ optional: true }) - readonly credentials?: Credentials; - - @Event('error') - readonly $onError!: (event: IErrorEvent) => void; - - @Event('activity') - readonly $onActivity!: (event: IActivityEvent) => Promise; - +export class HttpPlugin extends ConfigurableHttpPlugin { + // Expose Express methods for backwards compatibility readonly get: express.Application['get']; readonly post: express.Application['post']; readonly patch: express.Application['patch']; @@ -56,118 +32,55 @@ export class HttpPlugin { readonly route: express.Application['route']; readonly use: express.Application['use']; - get server() { - return this._server; - } - protected _server: http.Server; - - get port() { - return this._port; - } - protected _port?: number | string; - - protected express: express.Application; - protected skipAuth: boolean; + protected expressAdapter: ExpressAdapter; constructor(server?: http.Server, options?: { skipAuth?: boolean }) { - this.skipAuth = options?.skipAuth ?? false; - this.express = express(); - this._server = server || http.createServer(); - this._server.on('request', this.express); - this.get = this.express.get.bind(this.express); - this.post = this.express.post.bind(this.express); - this.patch = this.express.patch.bind(this.express); - this.put = this.express.put.bind(this.express); - this.delete = this.express.delete.bind(this.express); - this.route = this.express.route.bind(this.express); - this.use = this.express.use.bind(this.express); - - this.express.use(cors()); - this.express.use('/api*', express.json()); + const expressAdapter = new ExpressAdapter(server); + super(expressAdapter, options); + + this.expressAdapter = expressAdapter; + + // Expose Express methods + this.get = expressAdapter.get; + this.post = expressAdapter.post; + this.patch = expressAdapter.patch; + this.put = expressAdapter.put; + this.delete = expressAdapter.delete; + this.route = expressAdapter.route; + this.use = expressAdapter.use; } /** - * serve static files - * @param path the url path to serve - * @param dist the dist file path to serve + * Override initialization to add manifest route (backwards compatibility) */ - static(path: string, dist: string) { - this.express.use(path, express.static(dist)); - return this; - } - - onInit() { - const messageHandlers = [this.onRequest.bind(this)]; - if (!this.skipAuth) { - // Setup /api/messages route with JWT validation middleware - const jwtMiddleware = withJwtValidation({ - credentials: this.credentials, - logger: this.logger - }); - messageHandlers.unshift(jwtMiddleware); + protected async ensureInitialized() { + if (this.initialized) { + return; } - this.express.post('/api/messages', ...messageHandlers); - } - - async onStart({ port }: IPluginStartEvent) { - this._port = port; - - this.express.get('/', (_, res) => { - res.send(this.manifest); - }); - return await new Promise((resolve, reject) => { - this._server.on('error', (err) => { - this.$onError({ error: err }); - reject(err); - }); - - this._server.listen(port, () => { - this.logger.info(`listening on port ${port} 🚀`); - resolve(); - }); + // Call parent initialization (registers /api/messages) + await super.ensureInitialized(); + + // Register manifest route for backwards compatibility + this.expressAdapter.registerRoute({ + method: 'get', + path: '/', + handler: async ({ sendResponse }) => { + sendResponse({ + status: 200, + body: this.manifest + }); + } }); } - onStop() { - this._server.close(); - } - /** - * handles an incoming http request - * @param req the incoming http request - * @param res the http response + * serve static files + * @param path the url path to serve + * @param dist the dist file path to serve */ - protected async onRequest( - req: JwtValidatedRequest, - res: express.Response, - _next: express.NextFunction - ) { - try { - let token: IToken | undefined; - if (req.validatedToken) { - token = req.validatedToken; - } else { - token = { - appId: '', - from: 'azure', - fromId: '', - serviceUrl: req.body.serviceUrl || '', - isExpired: () => false, - }; - } - - const response = await this.$onActivity({ - body: req.body, - token, - }); - - res.status(response.status || 200).send(response.body); - } catch (err) { - this.logger.error('Error processing activity:', err); - if (!res.headersSent) { - res.status(500).send({ error: 'Internal server error' }); - } - } + static(path: string, dist: string) { + this.expressAdapter.static(path, dist); + return this; } } diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index 52f0bece1..8556c6c47 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -62,18 +62,18 @@ export class BotBuilderPlugin extends HttpPlugin { @Event('activity') declare readonly $onActivity: (event: IActivityEvent) => Promise; - protected adapter?: CloudAdapter; + protected cloudAdapter?: CloudAdapter; protected handler?: ActivityHandler; constructor(options?: BotBuilderPluginOptions) { super(options?.server, { skipAuth: options?.skipAuth }); - this.adapter = options?.adapter; + this.cloudAdapter = options?.adapter; this.handler = options?.handler; } async onInit() { await super.onInit(); - if (!this.adapter) { + if (!this.cloudAdapter) { const clientId = this.credentials?.clientId; const clientSecret = this.credentials && 'clientSecret' in this.credentials @@ -82,7 +82,7 @@ export class BotBuilderPlugin extends HttpPlugin { const tenantId = this.credentials && 'tenantId' in this.credentials ? this.credentials?.tenantId : undefined; - this.adapter = new CloudAdapter( + this.cloudAdapter = new CloudAdapter( new ConfigurationBotFrameworkAuthentication( {}, new ConfigurationServiceClientCredentialFactory({ @@ -101,7 +101,7 @@ export class BotBuilderPlugin extends HttpPlugin { res: express.Response, next: express.NextFunction ) { - if (!this.adapter) { + if (!this.cloudAdapter) { throw new Error('plugin not registered'); } @@ -120,7 +120,7 @@ export class BotBuilderPlugin extends HttpPlugin { }; } - await this.adapter.process(req, res, async (context) => { + await this.cloudAdapter.process(req, res, async (context) => { if (!context.activity.id) return; if (this.handler) { @@ -133,8 +133,7 @@ export class BotBuilderPlugin extends HttpPlugin { const response = await this.$onActivity({ token, - body: - new $Activity(context.activity as any) as Activity, + body: new $Activity(context.activity as any) as Activity, }); res.status(response.status || 200).send(response.body); From 8ab16d1c732975b35f746f1df78f6d58944ab70f Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 16 Jan 2026 08:30:55 -0800 Subject: [PATCH 02/33] Fix lint --- .../plugins/http/configurable-http-plugin.ts | 53 ++++++++++--------- .../apps/src/plugins/http/express-adapter.ts | 10 ++-- packages/apps/src/plugins/http/plugin.ts | 20 +++---- 3 files changed, 43 insertions(+), 40 deletions(-) diff --git a/packages/apps/src/plugins/http/configurable-http-plugin.ts b/packages/apps/src/plugins/http/configurable-http-plugin.ts index ede52e804..cf4e62954 100644 --- a/packages/apps/src/plugins/http/configurable-http-plugin.ts +++ b/packages/apps/src/plugins/http/configurable-http-plugin.ts @@ -58,41 +58,17 @@ export class ConfigurableHttpPlugin { } protected _port?: number | string; - private adapter: IHttpAdapter; protected skipAuth: boolean; protected initialized: boolean = false; + private adapter: IHttpAdapter; + constructor(adapter: IHttpAdapter, options?: { skipAuth?: boolean }) { this.adapter = adapter; this._server = adapter.getServer(); this.skipAuth = options?.skipAuth ?? false; } - /** - * Ensure adapter is initialized (only runs once) - */ - protected async ensureInitialized() { - if (this.initialized) { - return; - } - - // Framework-specific initialization (e.g., Next.js prepare) - if (this.adapter.initialize) { - await this.adapter.initialize(); - } - - // Register Teams bot endpoint - this.adapter.registerRoute({ - method: 'post', - path: '/api/messages', - handler: async (helpers) => { - await this.handleActivity(helpers); - } - }); - - this.initialized = true; - } - /** * Initialize the plugin - called by App during initialization * Sets up routes via the adapter @@ -135,6 +111,31 @@ export class ConfigurableHttpPlugin { this._server.close(); } + /** + * Ensure adapter is initialized (only runs once) + */ + protected async ensureInitialized() { + if (this.initialized) { + return; + } + + // Framework-specific initialization (e.g., Next.js prepare) + if (this.adapter.initialize) { + await this.adapter.initialize(); + } + + // Register Teams bot endpoint + this.adapter.registerRoute({ + method: 'post', + path: '/api/messages', + handler: async (helpers) => { + await this.handleActivity(helpers); + } + }); + + this.initialized = true; + } + /** * Handle incoming activity * Validates JWT, processes activity, sends response diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts index ba606f28a..6437909ce 100644 --- a/packages/apps/src/plugins/http/express-adapter.ts +++ b/packages/apps/src/plugins/http/express-adapter.ts @@ -1,6 +1,8 @@ import http from 'http'; + import cors from 'cors'; import express from 'express'; + import { IHttpAdapter, IRouteConfig } from './adapter'; /** @@ -13,10 +15,6 @@ import { IHttpAdapter, IRouteConfig } from './adapter'; * - Server lifecycle management */ export class ExpressAdapter implements IHttpAdapter { - protected express: express.Application; - protected server: http.Server; - protected isUserProvidedServer: boolean; - // Expose Express methods for backwards compatibility readonly get: express.Application['get']; readonly post: express.Application['post']; @@ -26,6 +24,10 @@ export class ExpressAdapter implements IHttpAdapter { readonly route: express.Application['route']; readonly use: express.Application['use']; + protected express: express.Application; + protected server: http.Server; + protected isUserProvidedServer: boolean; + constructor(server?: http.Server) { this.isUserProvidedServer = !!server; this.express = express(); diff --git a/packages/apps/src/plugins/http/plugin.ts b/packages/apps/src/plugins/http/plugin.ts index dddd97277..39edad6e7 100644 --- a/packages/apps/src/plugins/http/plugin.ts +++ b/packages/apps/src/plugins/http/plugin.ts @@ -50,6 +50,16 @@ export class HttpPlugin extends ConfigurableHttpPlugin { this.use = expressAdapter.use; } + /** + * serve static files + * @param path the url path to serve + * @param dist the dist file path to serve + */ + static(path: string, dist: string) { + this.expressAdapter.static(path, dist); + return this; + } + /** * Override initialization to add manifest route (backwards compatibility) */ @@ -73,14 +83,4 @@ export class HttpPlugin extends ConfigurableHttpPlugin { } }); } - - /** - * serve static files - * @param path the url path to serve - * @param dist the dist file path to serve - */ - static(path: string, dist: string) { - this.expressAdapter.static(path, dist); - return this; - } } From 4f53f18662a9c173ca48d3937f5212af78df02e1 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 00:40:25 -0800 Subject: [PATCH 03/33] Remove configurable-http-plugin for HttpServer. --- examples/http-adapters/README.md | 13 +- examples/http-adapters/express/README.md | 9 +- examples/http-adapters/express/index.ts | 24 +- examples/http-adapters/express/teams-app.ts | 61 +++-- examples/http-adapters/hono/README.md | 4 +- examples/http-adapters/hono/hono-adapter.ts | 26 ++- examples/http-adapters/hono/teams-app.ts | 15 +- examples/http-adapters/nextjs/README.md | 11 +- .../http-adapters/nextjs/nextjs-adapter.ts | 24 +- examples/http-adapters/nextjs/teams-app.ts | 26 ++- examples/http-adapters/nextjs/tsconfig.json | 34 +++ external/a2a/src/server/plugin.ts | 17 +- external/mcp/src/plugin.ts | 24 +- packages/apps/src/app.embed.ts | 85 +++++-- packages/apps/src/app.process.spec.ts | 9 +- packages/apps/src/app.spec.ts | 6 - packages/apps/src/app.ts | 77 +++++-- packages/apps/src/events/error.ts | 7 +- packages/apps/src/plugins/http/adapter.ts | 32 +-- .../plugins/http/configurable-http-plugin.ts | 217 ------------------ .../apps/src/plugins/http/express-adapter.ts | 26 +-- packages/apps/src/plugins/http/http-server.ts | 189 +++++++++++++++ packages/apps/src/plugins/http/index.ts | 2 +- packages/apps/src/plugins/http/plugin.spec.ts | 123 ++++++---- packages/apps/src/plugins/http/plugin.ts | 76 +++--- packages/botbuilder/src/plugin.ts | 33 ++- packages/dev/src/plugin.ts | 4 - 27 files changed, 683 insertions(+), 491 deletions(-) create mode 100644 examples/http-adapters/nextjs/tsconfig.json delete mode 100644 packages/apps/src/plugins/http/configurable-http-plugin.ts create mode 100644 packages/apps/src/plugins/http/http-server.ts diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md index a41bc3aeb..a4581d275 100644 --- a/examples/http-adapters/README.md +++ b/examples/http-adapters/README.md @@ -197,7 +197,7 @@ interface IHttpAdapter { All adapters follow the same pattern: ```typescript -import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { App, HttpServer } from '@microsoft/teams.apps'; import { MyAdapter } from './my-adapter'; // 1. Create adapter @@ -205,16 +205,11 @@ const adapter = new MyAdapter(); // 2. Create teams.ts app with adapter const app = new App({ - plugins: [ - new ConfigurableHttpPlugin(adapter, { skipAuth: true }) - ] + server: new HttpServer(adapter) }); -// 3. Initialize app (registers routes) -await app.initialize(); - -// 4. Manually start the server -await adapter.start(3978); +// 3. Start the app +await app.start(3978); ``` ## Creating Your Own Adapter diff --git a/examples/http-adapters/express/README.md b/examples/http-adapters/express/README.md index 2c1a324e2..dab0cdbdb 100644 --- a/examples/http-adapters/express/README.md +++ b/examples/http-adapters/express/README.md @@ -60,15 +60,10 @@ The server will start on `http://localhost:3978` with: ## How It Works ```typescript -import { App, ConfigurableHttpPlugin, ExpressAdapter } from '@microsoft/teams.apps'; +import { App, HttpServer, ExpressAdapter } from '@microsoft/teams.apps'; const app = new App({ - plugins: [ - new ConfigurableHttpPlugin( - new ExpressAdapter(), - { skipAuth: true } - ) - ] + server: new HttpServer(new ExpressAdapter()) }); ``` diff --git a/examples/http-adapters/express/index.ts b/examples/http-adapters/express/index.ts index 5ec55e00f..6566671e4 100644 --- a/examples/http-adapters/express/index.ts +++ b/examples/http-adapters/express/index.ts @@ -1,15 +1,27 @@ import 'dotenv/config'; -import { app } from './teams-app'; +import { app, httpServer } from './teams-app'; const port = parseInt(process.env.PORT || '3978', 10); async function main() { - // Start the app (ExpressAdapter handles server setup) - await app.start(port); + console.log('Starting Express server with Teams bot integration...\n'); - console.log(`> Server ready on http://localhost:${port}`); - console.log(`> Teams bot endpoint: /api/messages`); - console.log(`> Express server with Teams bot integration`); + // Initialize teams.ts app - this adds /api/messages to your Express app + await app.initialize(); + + // Start your Express server + await new Promise((resolve, reject) => { + httpServer.listen(port, () => resolve()); + httpServer.once('error', reject); + }); + + console.log(`✓ Server ready on http://localhost:${port}`); + console.log(`\nYour Express routes:`); + console.log(` GET / - Homepage`); + console.log(` GET /health - Health check`); + console.log(` GET /api/users - Users API`); + console.log(` POST /api/messages - Teams bot endpoint (added by teams.ts)`); + console.log(`\nOpen http://localhost:${port} in your browser!`); } main().catch((err) => { diff --git a/examples/http-adapters/express/teams-app.ts b/examples/http-adapters/express/teams-app.ts index 9c8acb9bc..395bef25c 100644 --- a/examples/http-adapters/express/teams-app.ts +++ b/examples/http-adapters/express/teams-app.ts @@ -1,22 +1,53 @@ -import { App, ConfigurableHttpPlugin, ExpressAdapter } from '@microsoft/teams.apps'; +import http from 'http'; +import express from 'express'; +import { App, HttpServer, ExpressAdapter } from '@microsoft/teams.apps'; -// Create teams.ts app with ExpressAdapter -// This is functionally equivalent to using HttpPlugin, but demonstrates -// the explicit adapter pattern for consistency with other frameworks +// 1. Create your existing Express app with routes +export const expressApp = express(); +export const httpServer = http.createServer(expressApp); + +// Add your custom routes +expressApp.get('/health', (req, res) => { + res.json({ status: 'healthy', timestamp: new Date().toISOString() }); +}); + +expressApp.get('/api/users', (req, res) => { + res.json({ + users: [ + { id: 1, name: 'Alice' }, + { id: 2, name: 'Bob' } + ] + }); +}); + +expressApp.get('/', (req, res) => { + res.send(` + + +

Express + teams.ts

+

Your Express server is running with a Teams bot!

+ + + + `); +}); + +// 2. Create Express adapter with your existing server +export const adapter = new ExpressAdapter(httpServer); + +// 3. Create HTTP server with the adapter +export const server = new HttpServer(adapter); + +// 4. Create teams.ts app with the HTTP server export const app = new App({ - plugins: [ - new ConfigurableHttpPlugin( - new ExpressAdapter(), - { skipAuth: true } - ) - ] + server }); -// Handle incoming messages +// 5. Handle incoming messages app.on('message', async ({ send, activity }) => { await send(`Echo from Express server: ${activity.text}`); }); - -// Example: Access the underlying Express app to add custom routes -// const adapter = app.http.adapter as ExpressAdapter; -// adapter.get('/health', (req, res) => res.json({ status: 'ok' })); diff --git a/examples/http-adapters/hono/README.md b/examples/http-adapters/hono/README.md index 498c58313..fb7ff842e 100644 --- a/examples/http-adapters/hono/README.md +++ b/examples/http-adapters/hono/README.md @@ -89,7 +89,7 @@ hono.get('/api/users', (c) => { ### 2. Hook Into teams.ts ```typescript -import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { App, HttpServer } from '@microsoft/teams.apps'; import { HonoAdapter } from './hono-adapter'; // Pass YOUR Hono app to the adapter @@ -97,7 +97,7 @@ const adapter = new HonoAdapter(hono); // Create teams.ts app const app = new App({ - plugins: [new ConfigurableHttpPlugin(adapter, { skipAuth: true })] + server: new HttpServer(adapter) }); // Handle bot messages diff --git a/examples/http-adapters/hono/hono-adapter.ts b/examples/http-adapters/hono/hono-adapter.ts index f9bed2352..200752549 100644 --- a/examples/http-adapters/hono/hono-adapter.ts +++ b/examples/http-adapters/hono/hono-adapter.ts @@ -3,7 +3,7 @@ import { Hono, Context } from 'hono'; import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/plugins/http/adapter'; /** - * Hono adapter for ConfigurableHttpPlugin + * Hono adapter for HttpServer * * Handles Hono-specific HTTP framework concerns: * - Accepts an existing Hono app (with your own routes) @@ -25,13 +25,6 @@ export class HonoAdapter implements IHttpAdapter { this.server = http.createServer(); } - /** - * Get the underlying HTTP server - */ - getServer(): http.Server { - return this.server; - } - /** * Register a route with Hono */ @@ -96,6 +89,23 @@ export class HonoAdapter implements IHttpAdapter { } } + /** + * Serve static files from a directory + */ + serveStatic(path: string, directory: string): void { + // Hono's static file serving + this.hono.get(`${path}/*`, async (c) => { + const filePath = c.req.path.replace(path, directory); + try { + const fs = await import('fs/promises'); + const content = await fs.readFile(filePath); + return c.body(content); + } catch { + return c.notFound(); + } + }); + } + /** * Initialize - attach Hono request handler to Node.js server */ diff --git a/examples/http-adapters/hono/teams-app.ts b/examples/http-adapters/hono/teams-app.ts index bd6392949..4886ada19 100644 --- a/examples/http-adapters/hono/teams-app.ts +++ b/examples/http-adapters/hono/teams-app.ts @@ -1,5 +1,5 @@ import { Hono } from 'hono'; -import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { App, HttpServer } from '@microsoft/teams.apps'; import { HonoAdapter } from './hono-adapter'; // 1. Create your Hono app with your own routes @@ -35,17 +35,18 @@ hono.get('/', (c) => { `); }); -// 2. Hook your Hono app into the adapter +// 2. Create Hono adapter with your Hono app export const adapter = new HonoAdapter(hono); -// 3. Create teams.ts app (will add /api/messages route to your Hono app) +// 3. Create HTTP server with the adapter +export const server = new HttpServer(adapter); + +// 4. Create teams.ts app with the HTTP server export const app = new App({ - plugins: [ - new ConfigurableHttpPlugin(adapter, { skipAuth: true }) - ] + server }); -// 4. Handle Teams bot messages +// 5. Handle Teams bot messages app.on('message', async ({ send, activity }) => { await send(`Echo from Hono server: ${activity.text}`); }); diff --git a/examples/http-adapters/nextjs/README.md b/examples/http-adapters/nextjs/README.md index bde318340..cf14d7d2d 100644 --- a/examples/http-adapters/nextjs/README.md +++ b/examples/http-adapters/nextjs/README.md @@ -34,7 +34,7 @@ The server will start on `http://localhost:3978` with: ## How It Works ```typescript -import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { App, HttpServer } from '@microsoft/teams.apps'; import { NextjsAdapter } from './nextjs-adapter'; // Create adapter and app @@ -43,14 +43,11 @@ const adapter = new NextjsAdapter(undefined, { }); const app = new App({ - plugins: [new ConfigurableHttpPlugin(adapter, { skipAuth: true })] + server: new HttpServer(adapter) }); -// Initialize app (registers routes) -await app.initialize(); - -// Manually start the server -await adapter.start(3978); +// Start the app +await app.start(3978); ``` The `NextjsAdapter` handles: diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts index aaefa3179..71ba6f704 100644 --- a/examples/http-adapters/nextjs/nextjs-adapter.ts +++ b/examples/http-adapters/nextjs/nextjs-adapter.ts @@ -3,7 +3,7 @@ import next from 'next'; import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/plugins/http/adapter'; /** - * Next.js adapter for ConfigurableHttpPlugin + * Next.js adapter for HttpServer * * Handles Next.js-specific concerns: * - Next.js app preparation and initialization @@ -40,13 +40,6 @@ export class NextjsAdapter implements IHttpAdapter { } } - /** - * Get the underlying HTTP server - */ - getServer(): http.Server { - return this.server; - } - /** * Register a route with the adapter * Routes are stored and handled before Next.js gets the request @@ -56,6 +49,21 @@ export class NextjsAdapter implements IHttpAdapter { this.routes.set(key, config); } + /** + * Serve static files from a directory + * Note: Next.js handles static files in public/ directory automatically + * This is for serving additional static directories + */ + serveStatic(_path: string, _directory: string): void { + // Next.js handles static files automatically via public/ directory + // For custom static file serving, users should use Next.js's built-in mechanisms + // This method is a no-op for Next.js adapter + throw new Error( + 'serveStatic() is not supported in Next.js adapter. ' + + 'Use Next.js built-in static file serving (public/ directory) instead.' + ); + } + /** * Initialize Next.js - prepare the Next.js app */ diff --git a/examples/http-adapters/nextjs/teams-app.ts b/examples/http-adapters/nextjs/teams-app.ts index 473a96140..c4c0851e9 100644 --- a/examples/http-adapters/nextjs/teams-app.ts +++ b/examples/http-adapters/nextjs/teams-app.ts @@ -1,22 +1,26 @@ -import { App, ConfigurableHttpPlugin } from '@microsoft/teams.apps'; +import { App, HttpServer } from '@microsoft/teams.apps'; import { NextjsAdapter } from './nextjs-adapter'; +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; -// Create NextjsAdapter instance +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +// 1. Create Next.js adapter export const adapter = new NextjsAdapter(undefined, { - dev: process.env.NODE_ENV !== 'production' + dev: process.env.NODE_ENV !== 'production', + dir: __dirname }); -// Create teams.ts app with NextjsAdapter +// 2. Create HTTP server with the adapter +export const server = new HttpServer(adapter); + +// 3. Create teams.ts app with the HTTP server export const app = new App({ - plugins: [ - new ConfigurableHttpPlugin( - adapter, - { skipAuth: true } - ) - ] + server }); -// Handle incoming messages +// 4. Handle incoming messages app.on('message', async ({ send, activity }) => { await send(`Echo from Next.js + teams.ts: ${activity.text}`); }); diff --git a/examples/http-adapters/nextjs/tsconfig.json b/examples/http-adapters/nextjs/tsconfig.json new file mode 100644 index 000000000..ccb2ed95d --- /dev/null +++ b/examples/http-adapters/nextjs/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": false, + "noEmit": true, + "incremental": true, + "module": "esnext", + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/external/a2a/src/server/plugin.ts b/external/a2a/src/server/plugin.ts index 314ecb8a9..b5d7f671c 100644 --- a/external/a2a/src/server/plugin.ts +++ b/external/a2a/src/server/plugin.ts @@ -17,7 +17,8 @@ import { Dependency, EmitPluginEvent, Event, - HttpPlugin, + ExpressAdapter, + HttpServer, IPlugin, Logger, Plugin, @@ -77,7 +78,8 @@ export class A2APlugin implements IPlugin { protected readonly emit!: EmitPluginEvent; @Dependency() - protected readonly _httpPlugin!: HttpPlugin; + protected readonly httpServer!: HttpServer; + __eventType!: A2AEvents; public readonly card: AgentCard; @@ -105,6 +107,14 @@ export class A2APlugin implements IPlugin { this.middlewares.push(middleware); } onInit() { + const adapter = this.httpServer.adapter; + if (!(adapter instanceof ExpressAdapter)) { + throw new Error( + 'A2APlugin requires ExpressAdapter. ' + + 'Please use: new App({ server: new HttpServer(new ExpressAdapter()) })' + ); + } + const a2aExpressApp = new A2AExpressApp(this._setupRequestHandler()); const expressApp = express(); @@ -122,7 +132,8 @@ export class A2APlugin implements IPlugin { ); this.log.info(`A2A agent set up at ${this.path}/${this.agentCardPath}`); this.log.info(`A2A agent listening at ${this.path}`); - this._httpPlugin.use(expressApp); + + adapter.use(expressApp); } _createLoggingMiddleware(): RequestHandler { diff --git a/external/mcp/src/plugin.ts b/external/mcp/src/plugin.ts index 3c763d300..0105be109 100644 --- a/external/mcp/src/plugin.ts +++ b/external/mcp/src/plugin.ts @@ -6,13 +6,15 @@ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolResult } from '@modelcontextprotocol/sdk/types.js'; +import express from 'express'; import { jsonSchemaToZod } from 'json-schema-to-zod'; import { z } from 'zod'; import { IChatPrompt } from '@microsoft/teams.ai'; import { Dependency, - HttpPlugin, + ExpressAdapter, + HttpServer, IPlugin, IPluginStartEvent, Logger, @@ -112,7 +114,7 @@ export class McpPlugin implements IPlugin { readonly logger!: ILogger; @Dependency() - readonly httpPlugin!: HttpPlugin; + readonly httpServer!: HttpServer; @Dependency({ optional: true }) readonly devtoolsPlugin?: DevtoolsPlugin; @@ -198,7 +200,7 @@ export class McpPlugin implements IPlugin { }); if (this.transport.type === 'sse') { - return this.onInitSSE(this.httpPlugin, this.transport); + return this.onInitSSE(this.transport); } return this.onInitStdio(this.transport); @@ -219,10 +221,19 @@ export class McpPlugin implements IPlugin { return this.server.connect(transport); } - protected onInitSSE(http: HttpPlugin, options: McpSSETransportOptions) { + protected onInitSSE(options: McpSSETransportOptions) { const path = options.path || '/mcp'; - http.get(path, (_, res) => { + const adapter = this.httpServer.adapter; + if (!(adapter instanceof ExpressAdapter)) { + throw new Error( + 'McpPlugin with SSE transport requires ExpressAdapter. ' + + 'Please use: new App({ server: new HttpServer(new ExpressAdapter()) })' + ); + } + + // Register GET endpoint for SSE connections + adapter.get(path, (_: express.Request, res: express.Response) => { this.id++; this.logger.debug('connecting...'); const transport = new SSEServerTransport( @@ -238,7 +249,8 @@ export class McpPlugin implements IPlugin { this.server.connect(transport); }); - http.post(`${path}/:id/messages`, (req, res) => { + // Register POST endpoint for SSE messages + adapter.post(`${path}/:id/messages`, (req: express.Request, res: express.Response) => { const id = +req.params.id; const { transport } = this.connections[id]; diff --git a/packages/apps/src/app.embed.ts b/packages/apps/src/app.embed.ts index 0094c3ac9..a01a41a07 100644 --- a/packages/apps/src/app.embed.ts +++ b/packages/apps/src/app.embed.ts @@ -1,11 +1,11 @@ +import fs from 'fs'; import npath from 'path'; import { ActivityLike } from '@microsoft/teams.api'; import { App } from './app'; -import { IFunctionContext } from './contexts'; +import { IClientContext, IFunctionContext } from './contexts'; import * as manifest from './manifest'; -import { JwtRemoteFunctionRequest, withRemoteFunctionJwtValidation } from './middleware'; import { IPlugin } from './types'; import { functionContext } from './utils'; @@ -20,23 +20,60 @@ export function func( cb: (context: IFunctionContext) => any | Promise ) { const log = this.log.child('functions').child(name); - this.http.post( - `/api/functions/${name}`, - withRemoteFunctionJwtValidation({ - logger: log, - entraTokenValidator: this.entraTokenValidator, - ...this.credentials, - }), - async (req: JwtRemoteFunctionRequest, res) => { - if (!req.context) { - throw new Error('expected client context'); + const entraTokenValidator = this.entraTokenValidator; + + this.server.registerRoute({ + method: 'post', + path: `/api/functions/${name}`, + handler: async (helpers) => { + const { body, headers } = helpers.extractRequestData(); + + // Extract and validate JWT token + const appSessionId = headers['x-teams-app-session-id']; + const pageId = headers['x-teams-page-id']; + const authorization = headers['authorization']?.split(' '); + const authToken = + authorization?.length === 2 && authorization[0].toLowerCase() === 'bearer' + ? authorization[1] + : ''; + + const tokenPayload = !entraTokenValidator + ? null + : await entraTokenValidator.validateAccessToken(authToken); + + if ( + !pageId || + !appSessionId || + !authToken || + !entraTokenValidator || + !tokenPayload + ) { + log.debug('unauthorized'); + helpers.sendResponse({ status: 401, body: 'unauthorized' }); + return; } + const context: IClientContext = { + appId: tokenPayload?.['appId'], + appSessionId, + authToken, + channelId: headers['x-teams-channel-id'], + chatId: headers['x-teams-chat-id'], + meetingId: headers['x-teams-meeting-id'], + messageId: headers['x-teams-message-id'], + pageId, + subPageId: headers['x-teams-sub-page-id'], + teamId: headers['x-teams-team-id'], + tenantId: tokenPayload['tid'], + userId: tokenPayload['oid'], + userName: tokenPayload['name'], + }; + const getCurrentConversationId = functionContext.getConversationIdResolver( this, log.child('getCurrentConversationId'), - req.context + context ); const send = async (activity: ActivityLike) => { @@ -47,18 +84,18 @@ export function func( }; const data = await cb({ - ...req.context, + ...context, log, api: this.api, appGraph: this.graph, - data: req.body, + data: body, getCurrentConversationId, send, }); - res.send(data); + helpers.sendResponse({ status: 200, body: data }); } - ); + }); return this; } @@ -95,9 +132,17 @@ export function tab( this._manifest.staticTabs.push(tab); } - this.http.static(`/tabs/${name}`, path); - this.http.use(`/tabs/${name}*`, async (_, res) => { - res.sendFile(npath.join(path, 'index.html')); + this.server.serveStatic(`/tabs/${name}`, path); + + // SPA fallback - serve index.html for sub-routes + const indexPath = npath.join(path, 'index.html'); + this.server.registerRoute({ + method: 'get', + path: `/tabs/${name}/*`, + handler: async (helpers) => { + const html = fs.readFileSync(indexPath, 'utf-8'); + helpers.sendResponse({ status: 200, body: html }); + } }); return this; diff --git a/packages/apps/src/app.process.spec.ts b/packages/apps/src/app.process.spec.ts index 04fbacca9..130e28c78 100644 --- a/packages/apps/src/app.process.spec.ts +++ b/packages/apps/src/app.process.spec.ts @@ -2,11 +2,9 @@ import { IMessageActivity, InvokeResponse, ITaskFetchInvokeActivity, IToken, Mes import { App } from './app'; import { IActivityEvent } from './events/activity'; -import { TestHttpPlugin } from './plugins/http/plugin.spec'; describe('App', () => { - let senderPlugin: TestHttpPlugin; - let app: App; + let app: App; const token: IToken = { appId: 'app-id', serviceUrl: 'https://service.url', @@ -18,10 +16,7 @@ describe('App', () => { const activity: IMessageActivity = new MessageActivity(); beforeEach(() => { - senderPlugin = new TestHttpPlugin(); - app = new App({ - plugins: [senderPlugin], - }); + app = new App(); app.start(); }); diff --git a/packages/apps/src/app.spec.ts b/packages/apps/src/app.spec.ts index eb0db063e..0aa4be05d 100644 --- a/packages/apps/src/app.spec.ts +++ b/packages/apps/src/app.spec.ts @@ -3,7 +3,6 @@ import jwt from 'jsonwebtoken'; import { JsonWebToken } from '@microsoft/teams.api'; import { App } from './app'; -import { TestHttpPlugin } from './plugins/http/plugin.spec'; class TestApp extends App { // Expose protected members for testing @@ -50,7 +49,6 @@ describe('App', () => { clientId: 'test-client-id', clientSecret: 'test-client-secret', tenantId: 'test-tenant-id', - plugins: [new TestHttpPlugin()], }); }); @@ -88,7 +86,6 @@ describe('App', () => { it('should return null when credentials are not provided', async () => { const appWithoutCreds = new TestApp({ - plugins: [new TestHttpPlugin()], }); const botToken = await appWithoutCreds.testGetBotToken(); @@ -120,7 +117,6 @@ describe('App', () => { clientId: 'test-client-id', clientSecret: 'test-client-secret', tenantId: 'test-tenant-id', - plugins: [new TestHttpPlugin()], }); await app.start(); @@ -145,7 +141,6 @@ describe('App', () => { manifest: { name: { short: 'TestBot', full: 'Test Bot Application' }, }, - plugins: [new TestHttpPlugin()], }); await app.start(); @@ -164,7 +159,6 @@ describe('App', () => { it('should throw error when app is not started (no clientId)', async () => { app = new TestApp({ - plugins: [new TestHttpPlugin()], }); await app.start(); diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index 13fde409e..31c01564c 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -39,7 +39,7 @@ import { IActivityEvent } from './events'; import * as manifest from './manifest'; import * as middleware from './middleware'; import { DEFAULT_OAUTH_SETTINGS, OAuthSettings } from './oauth'; -import { HttpPlugin } from './plugins'; +import { HttpPlugin, HttpServer, ExpressAdapter } from './plugins'; import { Router } from './router'; import { TokenManager } from './token-manager'; import { IPlugin, AppEvents } from './types'; @@ -107,6 +107,12 @@ export type AppOptions = { */ readonly plugins?: Array; + /** + * HTTP server instance (recommended) + * Use this instead of HttpPlugin in plugins array + */ + readonly server?: HttpServer; + /** * OAuth Settings */ @@ -150,7 +156,8 @@ export class App { readonly api: ApiClient; readonly graph: GraphClient; readonly log: ILogger; - readonly http: HttpPlugin; + readonly server: HttpServer; + readonly http?: HttpPlugin; readonly client: http.Client; readonly storage: IStorage; readonly entraTokenValidator?: middleware.JwtValidator; @@ -288,23 +295,50 @@ export class App { ); } - // add/validate plugins + // Determine HTTP server const plugins: Array = this.options.plugins || []; - let httpPlugin = plugins.find((p) => { + const httpPlugin = plugins.find((p) => { const meta = getMetadata(p); return meta.name === 'http'; }) as HttpPlugin | undefined; - if (!httpPlugin) { - httpPlugin = new HttpPlugin(undefined, { skipAuth: this.options.skipAuth }); - // Casting to any here because a default HttpPlugin is not assignable to TPlugin - // without a silly level of indirection. - plugins.unshift(httpPlugin as any); - } else if (this.options.skipAuth) { - this.log.warn('skipAuth option has no effect when a custom HTTP plugin is provided. Configure authentication on the plugin directly.'); + // Error if both server and http plugin are provided + if (this.options.server && httpPlugin) { + throw new Error( + 'Cannot provide both server option and HttpPlugin in plugins array. ' + + 'Use either:\n' + + ' - new App({ server: new HttpServer(new ExpressAdapter()) }) (recommended)\n' + + ' - new App({ plugins: [new HttpPlugin()] }) (deprecated)' + ); + } + + let server: HttpServer; + + // HttpPlugin in plugins array (backwards compatibility) + if (httpPlugin) { + this.log.warn('[DEPRECATED] HttpPlugin in plugins array will be deprecated. Use server option instead:\n' + + ' new App({ server: new HttpServer(new ExpressAdapter()) })'); + this.http = httpPlugin; + // Extract internal server and always set this.server + server = (httpPlugin as any).asServer?.(); + if (!server) { + throw new Error('HttpPlugin.asServer() returned undefined'); + } + } + // Explicit server option + else if (this.options.server) { + server = this.options.server; } + // Default: create Express server + else { + server = new HttpServer(new ExpressAdapter(), { skipAuth: this.options.skipAuth }); + } + + // Always set this.server + this.server = server; - this.http = httpPlugin; + // Set callback for handling activities + server.onRequest = (event) => this.onActivity(event); // add injectable items to container this.container.register('id', { useValue: this.id }); @@ -318,6 +352,10 @@ export class App { useFactory: () => this.client, }); + // Register HttpServer for plugins that need HTTP capabilities + this.container.register('HttpServer', { useValue: server }); + + // Register all plugins (including HttpPlugin if using old way) for (const plugin of plugins) { this.plugin(plugin); } @@ -360,6 +398,12 @@ export class App { * initialize the app. */ async initialize() { + // initialize server (register routes) + await this.server.initialize({ + logger: this.log, + credentials: this.credentials, + }); + // initialize plugins for (const plugin of this.plugins) { // inject dependencies @@ -369,7 +413,6 @@ export class App { plugin.onInit(); } } - } /** @@ -382,7 +425,12 @@ export class App { try { await this.initialize(); - // start plugins + // Start HTTP server + if (this.server) { + await this.server.start(this.port); + } + + // Start plugins for (const plugin of this.plugins) { if (plugin.onStart) { await plugin.onStart({ port: this.port }); @@ -400,6 +448,7 @@ export class App { */ async stop() { try { + // Stop plugins for (const plugin of this.plugins) { if (plugin.onStop) { await plugin.onStop(); diff --git a/packages/apps/src/events/error.ts b/packages/apps/src/events/error.ts index a275f2b1f..ea6c8b5cb 100644 --- a/packages/apps/src/events/error.ts +++ b/packages/apps/src/events/error.ts @@ -1,12 +1,17 @@ import { Activity } from '@microsoft/teams.api'; -import { IEvent } from '../types'; +import { IEvent, IPlugin } from '../types'; /** * the event emitted by a plugin * when an error occurs */ export interface IErrorEvent extends IEvent { + /** + * the sender + */ + readonly sender?: IPlugin; + /** * the error */ diff --git a/packages/apps/src/plugins/http/adapter.ts b/packages/apps/src/plugins/http/adapter.ts index 5c4e66bb2..86ac6f64a 100644 --- a/packages/apps/src/plugins/http/adapter.ts +++ b/packages/apps/src/plugins/http/adapter.ts @@ -1,5 +1,3 @@ -import http from 'http'; - /** * Helpers provided to route handlers */ @@ -30,16 +28,10 @@ export interface IRouteConfig { /** * Adapter interface for different HTTP frameworks * - * Adapters handle framework-specific HTTP concerns while ConfigurableHttpPlugin + * Adapters handle framework-specific HTTP concerns while HttpServer * handles Teams protocol logic (JWT validation, activity processing, etc.) */ export interface IHttpAdapter { - /** - * Get the underlying HTTP server - * The adapter owns the server (creates it or accepts it from user) - */ - getServer(): http.Server; - /** * Register a route with the adapter * The adapter handles framework-specific routing logic and provides helpers to the handler @@ -48,16 +40,24 @@ export interface IHttpAdapter { registerRoute(config: IRouteConfig): void; /** - * Optional: Framework-specific initialization - * Called during ConfigurableHttpPlugin.initialize() + * Serve static files from a directory + * @param path URL path prefix (e.g., '/static') + * @param directory File system directory to serve from + */ + serveStatic(path: string, directory: string): void; + + /** + * Framework-specific initialization + * Called during HttpServer.ensureInitialized() * Example: Next.js needs nextApp.prepare() + * Throw if not needed */ - initialize?(): Promise; + initialize(): Promise; /** - * Optional: Start the server - * Called during ConfigurableHttpPlugin.start() - * Should throw error if server is user-provided + * Start the server + * Called during HttpServer.start() + * Throw if server is user-provided and cannot be started */ - start?(port: number): Promise; + start(port: number): Promise; } diff --git a/packages/apps/src/plugins/http/configurable-http-plugin.ts b/packages/apps/src/plugins/http/configurable-http-plugin.ts deleted file mode 100644 index cf4e62954..000000000 --- a/packages/apps/src/plugins/http/configurable-http-plugin.ts +++ /dev/null @@ -1,217 +0,0 @@ -import http from 'http'; - -import { - Credentials, - InvokeResponse, - IToken -} from '@microsoft/teams.api'; - -import { ILogger } from '@microsoft/teams.common'; - -import pkg from '../../../package.json'; -import { IActivityEvent, IErrorEvent } from '../../events'; -import { Manifest } from '../../manifest'; -import { - Dependency, - Event, - IPluginStartEvent, - Logger, - Plugin, -} from '../../types'; - -import { IHttpAdapter, IRequestHelpers } from './adapter'; - -/** - * Configurable HTTP plugin that works with different HTTP frameworks via adapters - * - * This plugin handles Teams protocol logic (JWT validation, activity processing) - * while delegating HTTP framework concerns to the adapter. - */ -@Plugin({ - name: 'http', - version: pkg.version, - description: 'Configurable HTTP plugin that works with different frameworks via adapters', -}) -export class ConfigurableHttpPlugin { - @Logger() - readonly logger!: ILogger; - - @Dependency() - readonly manifest!: Partial; - - @Dependency({ optional: true }) - readonly credentials?: Credentials; - - @Event('error') - readonly $onError!: (event: IErrorEvent) => void; - - @Event('activity') - readonly $onActivity!: (event: IActivityEvent) => Promise; - - get server() { - return this._server; - } - protected _server: http.Server; - - get port() { - return this._port; - } - protected _port?: number | string; - - protected skipAuth: boolean; - protected initialized: boolean = false; - - private adapter: IHttpAdapter; - - constructor(adapter: IHttpAdapter, options?: { skipAuth?: boolean }) { - this.adapter = adapter; - this._server = adapter.getServer(); - this.skipAuth = options?.skipAuth ?? false; - } - - /** - * Initialize the plugin - called by App during initialization - * Sets up routes via the adapter - */ - async onInit() { - await this.ensureInitialized(); - } - - /** - * Start the plugin - called by App.start() - * Delegates to adapter's start method - */ - async onStart({ port }: IPluginStartEvent) { - await this.ensureInitialized(); - - this._port = port; - - // Delegate to adapter's start (may throw if user-provided server) - if (this.adapter.start) { - return await new Promise((resolve, reject) => { - this._server.on('error', (err) => { - this.$onError({ error: err }); - reject(err); - }); - - const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; - this.adapter.start!(portNumber).then(() => { - this.logger.info(`listening on port ${port} 🚀`); - resolve(); - }).catch(reject); - }); - } - } - - /** - * Stop the plugin - called by App.stop() - * Closes the server if we own it - */ - onStop() { - this._server.close(); - } - - /** - * Ensure adapter is initialized (only runs once) - */ - protected async ensureInitialized() { - if (this.initialized) { - return; - } - - // Framework-specific initialization (e.g., Next.js prepare) - if (this.adapter.initialize) { - await this.adapter.initialize(); - } - - // Register Teams bot endpoint - this.adapter.registerRoute({ - method: 'post', - path: '/api/messages', - handler: async (helpers) => { - await this.handleActivity(helpers); - } - }); - - this.initialized = true; - } - - /** - * Handle incoming activity - * Validates JWT, processes activity, sends response - */ - protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { - try { - // Extract data from request - const { body, headers } = extractRequestData(); - - // Validate JWT if not skipped - let token: IToken; - if (!this.skipAuth && this.credentials) { - // Validate JWT token - const authHeader = headers['authorization']; - if (!authHeader) { - sendResponse({ - status: 401, - body: { error: 'Unauthorized' } - }); - return; - } - - try { - token = await this.validateJwt(authHeader, body); - } catch (err) { - this.logger.error('JWT validation failed', err); - sendResponse({ - status: 401, - body: { error: 'Unauthorized' } - }); - return; - } - } else { - // Skip auth - create dummy token - token = { - appId: '', - from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, - }; - } - - // Process activity via App - const response = await this.$onActivity({ - body, - token, - }); - - // Send response - sendResponse({ - status: response.status || 200, - body: response.body - }); - } catch (err) { - this.logger.error('Error processing activity:', err); - sendResponse({ - status: 500, - body: { error: 'Internal server error' } - }); - } - } - - /** - * Validate JWT token - * Uses existing withJwtValidation middleware logic - */ - protected async validateJwt(_authHeader: string, body: any): Promise { - // TODO: Implement proper JWT validation using withJwtValidation middleware - // For now, return a basic token with credentials info - return { - appId: this.credentials?.clientId || '', - from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, - }; - } -} diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts index 6437909ce..07f85613e 100644 --- a/packages/apps/src/plugins/http/express-adapter.ts +++ b/packages/apps/src/plugins/http/express-adapter.ts @@ -6,7 +6,7 @@ import express from 'express'; import { IHttpAdapter, IRouteConfig } from './adapter'; /** - * Express adapter for ConfigurableHttpPlugin + * Express adapter for HttpServer * * Handles Express-specific HTTP framework concerns: * - Express app creation and middleware setup @@ -48,13 +48,6 @@ export class ExpressAdapter implements IHttpAdapter { this.express.use('/api*', express.json()); } - /** - * Get the underlying HTTP server - */ - getServer(): http.Server { - return this.server; - } - /** * Register a route with Express */ @@ -105,6 +98,14 @@ export class ExpressAdapter implements IHttpAdapter { } } + /** + * Initialize the adapter + * No-op for Express + */ + async initialize(): Promise { + // No initialization needed for Express + } + /** * Start the server * Throws if server was user-provided @@ -126,12 +127,9 @@ export class ExpressAdapter implements IHttpAdapter { } /** - * Serve static files - * @param path the url path to serve - * @param dist the dist file path to serve + * Serve static files from a directory */ - static(path: string, dist: string): this { - this.express.use(path, express.static(dist)); - return this; + serveStatic(path: string, directory: string): void { + this.express.use(path, express.static(directory)); } } diff --git a/packages/apps/src/plugins/http/http-server.ts b/packages/apps/src/plugins/http/http-server.ts new file mode 100644 index 000000000..eb1907d1c --- /dev/null +++ b/packages/apps/src/plugins/http/http-server.ts @@ -0,0 +1,189 @@ +import { + Credentials, + InvokeResponse, + IToken +} from '@microsoft/teams.api'; + +import { ILogger } from '@microsoft/teams.common'; + +import { IActivityEvent } from '../../events'; + +import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; + +export type HttpServerOptions = { + readonly skipAuth?: boolean; +}; + +/** + * Configurable HTTP server for receiving Teams activities + */ +export class HttpServer { + /** + * Callback invoked when a valid activity request arrives + * App should set this to process activities + */ + onRequest?: (event: IActivityEvent) => Promise; + + protected logger!: ILogger; + protected credentials?: Credentials; + protected skipAuth: boolean; + protected initialized: boolean = false; + + private _adapter: IHttpAdapter; + + /** + * Get the underlying adapter + * Useful for plugins that need adapter-specific features + */ + get adapter(): IHttpAdapter { + return this._adapter; + } + + constructor(adapter: IHttpAdapter, options?: HttpServerOptions) { + this._adapter = adapter; + this.skipAuth = options?.skipAuth ?? false; + } + + /** + * Initialize the server with dependencies (registers routes, prepares adapter) + * Can be called multiple times - only initializes once + * Called by App.initialize() + */ + async initialize(deps: { + logger: ILogger; + credentials?: Credentials; + }) { + if (this.initialized) { + this.logger?.debug('HttpServer already initialized, skipping'); + return; + } + + this.logger = deps.logger; + this.credentials = deps.credentials; + + // Framework-specific initialization (e.g., Next.js prepare) + await this._adapter.initialize(); + + // Register Teams bot endpoint + this._adapter.registerRoute({ + method: 'post', + path: '/api/messages', + handler: async (helpers) => { + await this.handleActivity(helpers); + } + }); + + this.initialized = true; + } + + /** + * Start the HTTP server + * Called by App.start() + */ + async start(port: number | string) { + const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; + await this._adapter.start(portNumber); + this.logger.info(`listening on port ${port} 🚀`); + } + + /** + * Register a route with the adapter + * Used by app.function() and other app methods + */ + registerRoute(config: IRouteConfig) { + this._adapter.registerRoute(config); + } + + /** + * Serve static files from a directory + * Used by app.tab() and other app methods + */ + serveStatic(path: string, directory: string) { + this._adapter.serveStatic(path, directory); + } + + + /** + * Handle incoming activity + * Validates JWT, signals app, sends response + */ + protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { + try { + // Extract data from request + const { body, headers } = extractRequestData(); + this.logger.debug('Handling activity', body); + + // Validate JWT if not skipped + let token: IToken; + if (!this.skipAuth && this.credentials) { + // Validate JWT token + const authHeader = headers['authorization']; + if (!authHeader) { + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + + try { + token = await this.validateJwt(authHeader, body); + } catch (err) { + this.logger.error('JWT validation failed', err); + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + } else { + // Skip auth - create dummy token + token = { + appId: '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } + + // Signal app to process activity + if (!this.onRequest) { + throw new Error('HttpServer.onRequest callback not set'); + } + + const response = await this.onRequest({ + body, + token, + }); + + // Send response + sendResponse({ + status: response.status || 200, + body: response.body + }); + } catch (err) { + this.logger.error('Error processing activity:', err); + sendResponse({ + status: 500, + body: { error: 'Internal server error' } + }); + } + } + + /** + * Validate JWT token + * Uses existing withJwtValidation middleware logic + */ + protected async validateJwt(_authHeader: string, body: any): Promise { + // TODO: Implement proper JWT validation using withJwtValidation middleware + // For now, return a basic token with credentials info + return { + appId: this.credentials?.clientId || '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } +} diff --git a/packages/apps/src/plugins/http/index.ts b/packages/apps/src/plugins/http/index.ts index 2731db20d..2517e18b5 100644 --- a/packages/apps/src/plugins/http/index.ts +++ b/packages/apps/src/plugins/http/index.ts @@ -1,4 +1,4 @@ export * from './plugin'; -export * from './configurable-http-plugin'; +export * from './http-server'; export * from './adapter'; export * from './express-adapter'; diff --git a/packages/apps/src/plugins/http/plugin.spec.ts b/packages/apps/src/plugins/http/plugin.spec.ts index de37e4957..6a952e1e7 100644 --- a/packages/apps/src/plugins/http/plugin.spec.ts +++ b/packages/apps/src/plugins/http/plugin.spec.ts @@ -1,70 +1,93 @@ -import e from 'express'; - -import { IMessageActivity, IToken, MessageActivity } from '@microsoft/teams.api'; +import http from 'http'; import { App } from '../../app'; -import { JwtValidatedRequest } from '../../middleware'; -import { IPluginStartEvent } from '../../types'; - +import { HttpServer } from './http-server'; import { HttpPlugin } from './plugin'; -export class TestHttpPlugin extends HttpPlugin { - async onStart(_event: IPluginStartEvent) { - // No-op for tests - } +describe('HttpPlugin', () => { + describe('constructor', () => { + it('should create with default options', () => { + const plugin = new HttpPlugin(); + expect(plugin).toBeDefined(); + expect(plugin.get).toBeDefined(); + expect(plugin.post).toBeDefined(); + expect(plugin.use).toBeDefined(); + }); - async onStop() { - // No-op for tests - } + it('should create with custom http.Server', () => { + const server = http.createServer(); + const plugin = new HttpPlugin(server); + expect(plugin).toBeDefined(); + }); - async OnRequestTest(req: JwtValidatedRequest, res: e.Response, _next: e.NextFunction) { - await this.onRequest(req, res, _next); - } -} + it('should create with skipAuth option', () => { + const plugin = new HttpPlugin(undefined, { skipAuth: true }); + expect(plugin).toBeDefined(); + }); + }); -describe('HttpPlugin', () => { - let plugin: TestHttpPlugin; - let app: App; - const token: IToken = { - appId: 'app-id', - serviceUrl: 'https://service.url', - from: 'bot', - fromId: 'bot-id', - toString: () => 'token', - isExpired: () => false, - }; - const activity: IMessageActivity = new MessageActivity(); - - beforeEach(() => { - plugin = new TestHttpPlugin(); - app = new App({ - plugins: [plugin], + describe('asServer', () => { + it('should return HttpServer instance', () => { + const plugin = new HttpPlugin(); + const server = plugin.asServer(); + expect(server).toBeInstanceOf(HttpServer); }); - app.start(); }); - afterEach(() => { - app.stop(); + describe('Express method delegation', () => { + it('should expose Express methods', () => { + const plugin = new HttpPlugin(); + + // These should be function references + expect(typeof plugin.get).toBe('function'); + expect(typeof plugin.post).toBe('function'); + expect(typeof plugin.patch).toBe('function'); + expect(typeof plugin.put).toBe('function'); + expect(typeof plugin.delete).toBe('function'); + expect(typeof plugin.route).toBe('function'); + expect(typeof plugin.use).toBe('function'); + }); }); - describe('OnRequest', () => { - it('should process incoming request', async () => { - const req = { - body: activity, - validatedToken: token, - } as JwtValidatedRequest; + describe('static', () => { + it('should call expressAdapter.serveStatic', () => { + const plugin = new HttpPlugin(); + const serveStaticSpy = jest.spyOn((plugin as any).expressAdapter, 'serveStatic'); - app.use(() => { - return { status: 200, body: 'some data' }; + plugin.static('/test', './dist'); + + expect(serveStaticSpy).toHaveBeenCalledWith('/test', './dist'); + }); + }); + + describe('backwards compatibility with App', () => { + it('should work when passed in plugins array', () => { + const plugin = new HttpPlugin(); + const app = new App({ + plugins: [plugin], }); - const res = { send: jest.fn(), status: jest.fn().mockReturnThis() } as any; - const next = jest.fn(); + expect(app.http).toBe(plugin); + expect(app.server).toBeDefined(); + }); + + it('should allow direct plugin usage', () => { + const plugin = new HttpPlugin(); + + // Should be able to call Express methods directly + const mockHandler = jest.fn(); + plugin.post('/test', mockHandler); + + // Verify it was registered (we can't easily test execution without starting server) + expect(mockHandler).toBeDefined(); + }); + }); - await plugin.OnRequestTest(req, res, next); - expect(res.status).toHaveBeenCalledWith(200); - expect(res.send).toHaveBeenCalledWith('some data'); + describe('onInit lifecycle', () => { + it('should have onInit method', async () => { + const plugin = new HttpPlugin(); + await expect(plugin.onInit()).resolves.toBeUndefined(); }); }); }); diff --git a/packages/apps/src/plugins/http/plugin.ts b/packages/apps/src/plugins/http/plugin.ts index 39edad6e7..2b27242fd 100644 --- a/packages/apps/src/plugins/http/plugin.ts +++ b/packages/apps/src/plugins/http/plugin.ts @@ -5,24 +5,24 @@ import express from 'express'; import pkg from '../../../package.json'; import { Plugin } from '../../types'; -import { ConfigurableHttpPlugin } from './configurable-http-plugin'; import { ExpressAdapter } from './express-adapter'; +import { HttpServer } from './http-server'; /** - * Receives activities via HTTP using Express + * @deprecated Will be deprecated. Use HttpServer instead: + * new App({ server: new HttpServer(new ExpressAdapter()) }) + * + * This wrapper will be removed in a few patch versions. * * NOTE: This plugin is named "HttpPlugin" for historical reasons and backwards compatibility. * It is the default HTTP plugin that uses Express as the underlying framework. - * - * This is a wrapper around ConfigurableHttpPlugin + ExpressAdapter for backwards compatibility. - * For other frameworks (Hono, Next.js, etc.), use ConfigurableHttpPlugin with the appropriate adapter. */ @Plugin({ name: 'http', version: pkg.version, - description: 'the default plugin for receiving activities via HTTP', + description: 'Will be deprecated: Use HttpServer with server option instead', }) -export class HttpPlugin extends ConfigurableHttpPlugin { +export class HttpPlugin { // Expose Express methods for backwards compatibility readonly get: express.Application['get']; readonly post: express.Application['post']; @@ -33,54 +33,44 @@ export class HttpPlugin extends ConfigurableHttpPlugin { readonly use: express.Application['use']; protected expressAdapter: ExpressAdapter; + protected _server: HttpServer; constructor(server?: http.Server, options?: { skipAuth?: boolean }) { - const expressAdapter = new ExpressAdapter(server); - super(expressAdapter, options); - - this.expressAdapter = expressAdapter; + this.expressAdapter = new ExpressAdapter(server); + this._server = new HttpServer(this.expressAdapter, options); // Expose Express methods - this.get = expressAdapter.get; - this.post = expressAdapter.post; - this.patch = expressAdapter.patch; - this.put = expressAdapter.put; - this.delete = expressAdapter.delete; - this.route = expressAdapter.route; - this.use = expressAdapter.use; + this.get = this.expressAdapter.get; + this.post = this.expressAdapter.post; + this.patch = this.expressAdapter.patch; + this.put = this.expressAdapter.put; + this.delete = this.expressAdapter.delete; + this.route = this.expressAdapter.route; + this.use = this.expressAdapter.use; } /** - * serve static files - * @param path the url path to serve - * @param dist the dist file path to serve + * App.constructor calls this to extract the HttpServer + * @internal */ - static(path: string, dist: string) { - this.expressAdapter.static(path, dist); - return this; + asServer(): HttpServer { + return this._server; } /** - * Override initialization to add manifest route (backwards compatibility) + * Plugin lifecycle hook */ - protected async ensureInitialized() { - if (this.initialized) { - return; - } - - // Call parent initialization (registers /api/messages) - await super.ensureInitialized(); + async onInit() { + // No-op + } - // Register manifest route for backwards compatibility - this.expressAdapter.registerRoute({ - method: 'get', - path: '/', - handler: async ({ sendResponse }) => { - sendResponse({ - status: 200, - body: this.manifest - }); - } - }); + /** + * serve static files + * @param path the url path to serve + * @param dist the dist file path to serve + */ + static(path: string, dist: string) { + this.expressAdapter.serveStatic(path, dist); + return this; } } diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index 8556c6c47..16080a755 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -1,5 +1,3 @@ -import http from 'http'; - import { ActivityHandler, CloudAdapter, @@ -13,9 +11,11 @@ import { $Activity, Activity, Credentials, InvokeResponse, IToken } from '@micro import { Dependency, Event, - HttpPlugin, + ExpressAdapter, + HttpServer, IActivityEvent, IErrorEvent, + IPlugin, Logger, Plugin, manifest, @@ -29,21 +29,22 @@ import pkg from '../package.json'; export type BotBuilderPluginOptions = { readonly adapter?: CloudAdapter; readonly handler?: ActivityHandler; - readonly server?: http.Server; - readonly skipAuth?: boolean; }; @Plugin({ - name: 'http', + name: 'botbuilder', version: pkg.version, }) -export class BotBuilderPlugin extends HttpPlugin { +export class BotBuilderPlugin implements IPlugin { @Logger() declare readonly logger: ILogger; @Dependency() declare readonly client: $http.Client; + @Dependency() + declare readonly httpServer: HttpServer; + @Dependency() declare readonly manifest: Partial; @@ -66,13 +67,19 @@ export class BotBuilderPlugin extends HttpPlugin { protected handler?: ActivityHandler; constructor(options?: BotBuilderPluginOptions) { - super(options?.server, { skipAuth: options?.skipAuth }); this.cloudAdapter = options?.adapter; this.handler = options?.handler; } async onInit() { - await super.onInit(); + const adapter = this.httpServer.adapter; + if (!(adapter instanceof ExpressAdapter)) { + throw new Error( + 'BotBuilderPlugin requires ExpressAdapter. ' + + 'Please use: new App({ server: new HttpServer(new ExpressAdapter()) })' + ); + } + if (!this.cloudAdapter) { const clientId = this.credentials?.clientId; const clientSecret = @@ -94,6 +101,14 @@ export class BotBuilderPlugin extends HttpPlugin { ) ); } + + // Register /api/messages route with BotBuilder handler + adapter.post( + '/api/messages', + (req: JwtValidatedRequest, res: express.Response, next: express.NextFunction) => { + this.onRequest(req, res, next).catch(next); + } + ); } protected async onRequest( diff --git a/packages/dev/src/plugin.ts b/packages/dev/src/plugin.ts index e1184b754..069997201 100644 --- a/packages/dev/src/plugin.ts +++ b/packages/dev/src/plugin.ts @@ -9,7 +9,6 @@ import { WebSocket, WebSocketServer } from 'ws'; import { InvokeResponse, IToken } from '@microsoft/teams.api'; import { - HttpPlugin, Logger, IPluginActivityEvent, IPluginActivityResponseEvent, @@ -55,9 +54,6 @@ export class DevtoolsPlugin { @Dependency({ optional: true }) readonly name?: IToken; - @Dependency() - readonly httpPlugin!: HttpPlugin; - @Event('error') readonly $onError!: (event: IErrorEvent) => void; From 660e3920d436d7ad8e5cf73e371121087dd8690e Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Tue, 20 Jan 2026 10:48:00 -0800 Subject: [PATCH 04/33] Use Adapter --- examples/http-adapters/README.md | 9 +++--- examples/http-adapters/express/README.md | 4 +-- examples/http-adapters/express/teams-app.ts | 11 +++---- examples/http-adapters/hono/README.md | 4 +-- examples/http-adapters/hono/hono-adapter.ts | 2 +- examples/http-adapters/hono/teams-app.ts | 11 +++---- examples/http-adapters/nextjs/README.md | 4 +-- .../http-adapters/nextjs/nextjs-adapter.ts | 2 +- examples/http-adapters/nextjs/teams-app.ts | 11 +++---- external/a2a/src/server/plugin.ts | 4 +-- external/mcp/src/plugin.ts | 4 +-- packages/apps/src/activity-sender.ts | 4 +-- packages/apps/src/app.ts | 29 ++++++++++--------- .../apps/src/{plugins => }/http/adapter.ts | 0 .../src/{plugins => }/http/express-adapter.ts | 0 .../src/{plugins => }/http/http-server.ts | 27 +++++++++++++++-- .../apps/src/{ => http}/http-stream.spec.ts | 0 packages/apps/src/{ => http}/http-stream.ts | 4 +-- packages/apps/src/http/index.ts | 4 +++ packages/apps/src/index.ts | 4 +++ packages/apps/src/plugins/http/index.ts | 3 -- packages/apps/src/plugins/http/plugin.spec.ts | 2 +- packages/apps/src/plugins/http/plugin.ts | 5 ++-- packages/botbuilder/src/plugin.ts | 4 +-- 24 files changed, 85 insertions(+), 67 deletions(-) rename packages/apps/src/{plugins => }/http/adapter.ts (100%) rename packages/apps/src/{plugins => }/http/express-adapter.ts (100%) rename packages/apps/src/{plugins => }/http/http-server.ts (88%) rename packages/apps/src/{ => http}/http-stream.spec.ts (100%) rename packages/apps/src/{ => http}/http-stream.ts (98%) create mode 100644 packages/apps/src/http/index.ts diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md index a4581d275..d78bdf83e 100644 --- a/examples/http-adapters/README.md +++ b/examples/http-adapters/README.md @@ -4,7 +4,7 @@ This example demonstrates how to use **teams.ts** with different HTTP frameworks ## What is an HTTP Adapter? -An HTTP adapter bridges a specific HTTP framework (Express, Hono, Next.js, etc.) with the teams.ts `ConfigurableHttpPlugin`. This allows you to: +An HTTP adapter bridges a specific HTTP framework (Express, Hono, Next.js, etc.) with teams.ts. This allows you to: - ✅ Use any HTTP framework you prefer - ✅ Co-locate your bot with existing web applications @@ -65,8 +65,7 @@ All adapters start on `http://localhost:3978` with the Teams bot endpoint at `/a │ teams.ts App │ │ │ │ ┌───────────┐ │ -│ │Configurable│ │ ← Generic plugin (framework-agnostic) -│ │HttpPlugin │ │ +│ │HttpServer │ │ ← Teams bot infrastructure (framework-agnostic) │ └─────┬──────┘ │ └────────┼─────────┘ │ @@ -197,7 +196,7 @@ interface IHttpAdapter { All adapters follow the same pattern: ```typescript -import { App, HttpServer } from '@microsoft/teams.apps'; +import { App } from '@microsoft/teams.apps'; import { MyAdapter } from './my-adapter'; // 1. Create adapter @@ -205,7 +204,7 @@ const adapter = new MyAdapter(); // 2. Create teams.ts app with adapter const app = new App({ - server: new HttpServer(adapter) + httpAdapter: adapter }); // 3. Start the app diff --git a/examples/http-adapters/express/README.md b/examples/http-adapters/express/README.md index dab0cdbdb..321f6972d 100644 --- a/examples/http-adapters/express/README.md +++ b/examples/http-adapters/express/README.md @@ -60,10 +60,10 @@ The server will start on `http://localhost:3978` with: ## How It Works ```typescript -import { App, HttpServer, ExpressAdapter } from '@microsoft/teams.apps'; +import { App, ExpressAdapter } from '@microsoft/teams.apps'; const app = new App({ - server: new HttpServer(new ExpressAdapter()) + httpAdapter: new ExpressAdapter() }); ``` diff --git a/examples/http-adapters/express/teams-app.ts b/examples/http-adapters/express/teams-app.ts index 395bef25c..a88690483 100644 --- a/examples/http-adapters/express/teams-app.ts +++ b/examples/http-adapters/express/teams-app.ts @@ -1,6 +1,6 @@ import http from 'http'; import express from 'express'; -import { App, HttpServer, ExpressAdapter } from '@microsoft/teams.apps'; +import { App, ExpressAdapter } from '@microsoft/teams.apps'; // 1. Create your existing Express app with routes export const expressApp = express(); @@ -39,15 +39,12 @@ expressApp.get('/', (req, res) => { // 2. Create Express adapter with your existing server export const adapter = new ExpressAdapter(httpServer); -// 3. Create HTTP server with the adapter -export const server = new HttpServer(adapter); - -// 4. Create teams.ts app with the HTTP server +// 3. Create teams.ts app with the adapter export const app = new App({ - server + httpAdapter: adapter }); -// 5. Handle incoming messages +// 4. Handle incoming messages app.on('message', async ({ send, activity }) => { await send(`Echo from Express server: ${activity.text}`); }); diff --git a/examples/http-adapters/hono/README.md b/examples/http-adapters/hono/README.md index fb7ff842e..7147b3dc0 100644 --- a/examples/http-adapters/hono/README.md +++ b/examples/http-adapters/hono/README.md @@ -89,7 +89,7 @@ hono.get('/api/users', (c) => { ### 2. Hook Into teams.ts ```typescript -import { App, HttpServer } from '@microsoft/teams.apps'; +import { App } from '@microsoft/teams.apps'; import { HonoAdapter } from './hono-adapter'; // Pass YOUR Hono app to the adapter @@ -97,7 +97,7 @@ const adapter = new HonoAdapter(hono); // Create teams.ts app const app = new App({ - server: new HttpServer(adapter) + httpAdapter: adapter }); // Handle bot messages diff --git a/examples/http-adapters/hono/hono-adapter.ts b/examples/http-adapters/hono/hono-adapter.ts index 200752549..15b6f17d8 100644 --- a/examples/http-adapters/hono/hono-adapter.ts +++ b/examples/http-adapters/hono/hono-adapter.ts @@ -1,6 +1,6 @@ import http from 'http'; import { Hono, Context } from 'hono'; -import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/plugins/http/adapter'; +import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adapter'; /** * Hono adapter for HttpServer diff --git a/examples/http-adapters/hono/teams-app.ts b/examples/http-adapters/hono/teams-app.ts index 4886ada19..fea8de1f6 100644 --- a/examples/http-adapters/hono/teams-app.ts +++ b/examples/http-adapters/hono/teams-app.ts @@ -1,5 +1,5 @@ import { Hono } from 'hono'; -import { App, HttpServer } from '@microsoft/teams.apps'; +import { App } from '@microsoft/teams.apps'; import { HonoAdapter } from './hono-adapter'; // 1. Create your Hono app with your own routes @@ -38,15 +38,12 @@ hono.get('/', (c) => { // 2. Create Hono adapter with your Hono app export const adapter = new HonoAdapter(hono); -// 3. Create HTTP server with the adapter -export const server = new HttpServer(adapter); - -// 4. Create teams.ts app with the HTTP server +// 3. Create teams.ts app with the adapter export const app = new App({ - server + httpAdapter: adapter }); -// 5. Handle Teams bot messages +// 4. Handle Teams bot messages app.on('message', async ({ send, activity }) => { await send(`Echo from Hono server: ${activity.text}`); }); diff --git a/examples/http-adapters/nextjs/README.md b/examples/http-adapters/nextjs/README.md index cf14d7d2d..4f4d61bfc 100644 --- a/examples/http-adapters/nextjs/README.md +++ b/examples/http-adapters/nextjs/README.md @@ -34,7 +34,7 @@ The server will start on `http://localhost:3978` with: ## How It Works ```typescript -import { App, HttpServer } from '@microsoft/teams.apps'; +import { App } from '@microsoft/teams.apps'; import { NextjsAdapter } from './nextjs-adapter'; // Create adapter and app @@ -43,7 +43,7 @@ const adapter = new NextjsAdapter(undefined, { }); const app = new App({ - server: new HttpServer(adapter) + httpAdapter: adapter }); // Start the app diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts index 71ba6f704..ef50241bf 100644 --- a/examples/http-adapters/nextjs/nextjs-adapter.ts +++ b/examples/http-adapters/nextjs/nextjs-adapter.ts @@ -1,6 +1,6 @@ import http from 'http'; import next from 'next'; -import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/plugins/http/adapter'; +import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adapter'; /** * Next.js adapter for HttpServer diff --git a/examples/http-adapters/nextjs/teams-app.ts b/examples/http-adapters/nextjs/teams-app.ts index c4c0851e9..bc70d2519 100644 --- a/examples/http-adapters/nextjs/teams-app.ts +++ b/examples/http-adapters/nextjs/teams-app.ts @@ -1,4 +1,4 @@ -import { App, HttpServer } from '@microsoft/teams.apps'; +import { App } from '@microsoft/teams.apps'; import { NextjsAdapter } from './nextjs-adapter'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; @@ -12,15 +12,12 @@ export const adapter = new NextjsAdapter(undefined, { dir: __dirname }); -// 2. Create HTTP server with the adapter -export const server = new HttpServer(adapter); - -// 3. Create teams.ts app with the HTTP server +// 2. Create teams.ts app with the adapter export const app = new App({ - server + httpAdapter: adapter }); -// 4. Handle incoming messages +// 3. Handle incoming messages app.on('message', async ({ send, activity }) => { await send(`Echo from Next.js + teams.ts: ${activity.text}`); }); diff --git a/external/a2a/src/server/plugin.ts b/external/a2a/src/server/plugin.ts index b5d7f671c..30006195b 100644 --- a/external/a2a/src/server/plugin.ts +++ b/external/a2a/src/server/plugin.ts @@ -18,7 +18,7 @@ import { EmitPluginEvent, Event, ExpressAdapter, - HttpServer, + IHttpServer, IPlugin, Logger, Plugin, @@ -78,7 +78,7 @@ export class A2APlugin implements IPlugin { protected readonly emit!: EmitPluginEvent; @Dependency() - protected readonly httpServer!: HttpServer; + protected readonly httpServer!: IHttpServer; __eventType!: A2AEvents; diff --git a/external/mcp/src/plugin.ts b/external/mcp/src/plugin.ts index 0105be109..cd2782b5a 100644 --- a/external/mcp/src/plugin.ts +++ b/external/mcp/src/plugin.ts @@ -14,7 +14,7 @@ import { IChatPrompt } from '@microsoft/teams.ai'; import { Dependency, ExpressAdapter, - HttpServer, + IHttpServer, IPlugin, IPluginStartEvent, Logger, @@ -114,7 +114,7 @@ export class McpPlugin implements IPlugin { readonly logger!: ILogger; @Dependency() - readonly httpServer!: HttpServer; + readonly httpServer!: IHttpServer; @Dependency({ optional: true }) readonly devtoolsPlugin?: DevtoolsPlugin; diff --git a/packages/apps/src/activity-sender.ts b/packages/apps/src/activity-sender.ts index 7c96f377f..2f2431a06 100644 --- a/packages/apps/src/activity-sender.ts +++ b/packages/apps/src/activity-sender.ts @@ -2,8 +2,8 @@ import { ActivityParams, Client, ConversationReference, SentActivity } from '@mi import * as $http from '@microsoft/teams.common/http'; import { ILogger } from '@microsoft/teams.common/logging'; -import { HttpStream } from './http-stream'; -import { IActivitySender, IStreamer } from './types'; +import { HttpStream } from './http/http-stream'; +import { IStreamer, IActivitySender } from './types'; /** * Handles sending activities to the Bot Framework diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index 31c01564c..e545648df 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -36,10 +36,12 @@ import { $process } from './app.process'; import { message, on, use } from './app.routing'; import { Container } from './container'; import { IActivityEvent } from './events'; +import { ExpressAdapter, IHttpAdapter } from './http'; +import { HttpServer } from './http/http-server'; import * as manifest from './manifest'; import * as middleware from './middleware'; import { DEFAULT_OAUTH_SETTINGS, OAuthSettings } from './oauth'; -import { HttpPlugin, HttpServer, ExpressAdapter } from './plugins'; +import { HttpPlugin } from './plugins'; import { Router } from './router'; import { TokenManager } from './token-manager'; import { IPlugin, AppEvents } from './types'; @@ -108,10 +110,9 @@ export type AppOptions = { readonly plugins?: Array; /** - * HTTP server instance (recommended) - * Use this instead of HttpPlugin in plugins array + * HTTP adapter for handling bot requests */ - readonly server?: HttpServer; + readonly httpAdapter?: IHttpAdapter; /** * OAuth Settings @@ -302,12 +303,12 @@ export class App { return meta.name === 'http'; }) as HttpPlugin | undefined; - // Error if both server and http plugin are provided - if (this.options.server && httpPlugin) { + // Error if both httpAdapter and http plugin are provided + if (this.options.httpAdapter && httpPlugin) { throw new Error( - 'Cannot provide both server option and HttpPlugin in plugins array. ' + + 'Cannot provide both httpAdapter option and HttpPlugin in plugins array. ' + 'Use either:\n' + - ' - new App({ server: new HttpServer(new ExpressAdapter()) }) (recommended)\n' + + ' - new App({ httpAdapter: new ExpressAdapter() }) (recommended)\n' + ' - new App({ plugins: [new HttpPlugin()] }) (deprecated)' ); } @@ -316,8 +317,8 @@ export class App { // HttpPlugin in plugins array (backwards compatibility) if (httpPlugin) { - this.log.warn('[DEPRECATED] HttpPlugin in plugins array will be deprecated. Use server option instead:\n' + - ' new App({ server: new HttpServer(new ExpressAdapter()) })'); + this.log.warn('[DEPRECATED] HttpPlugin in plugins array will be deprecated. Use httpAdapter option instead:\n' + + ' new App({ httpAdapter: new ExpressAdapter() })'); this.http = httpPlugin; // Extract internal server and always set this.server server = (httpPlugin as any).asServer?.(); @@ -325,9 +326,9 @@ export class App { throw new Error('HttpPlugin.asServer() returned undefined'); } } - // Explicit server option - else if (this.options.server) { - server = this.options.server; + // Explicit httpAdapter option + else if (this.options.httpAdapter) { + server = new HttpServer(this.options.httpAdapter, { skipAuth: this.options.skipAuth }); } // Default: create Express server else { @@ -353,7 +354,7 @@ export class App { }); // Register HttpServer for plugins that need HTTP capabilities - this.container.register('HttpServer', { useValue: server }); + this.container.register('IHttpServer', { useValue: server }); // Register all plugins (including HttpPlugin if using old way) for (const plugin of plugins) { diff --git a/packages/apps/src/plugins/http/adapter.ts b/packages/apps/src/http/adapter.ts similarity index 100% rename from packages/apps/src/plugins/http/adapter.ts rename to packages/apps/src/http/adapter.ts diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/http/express-adapter.ts similarity index 100% rename from packages/apps/src/plugins/http/express-adapter.ts rename to packages/apps/src/http/express-adapter.ts diff --git a/packages/apps/src/plugins/http/http-server.ts b/packages/apps/src/http/http-server.ts similarity index 88% rename from packages/apps/src/plugins/http/http-server.ts rename to packages/apps/src/http/http-server.ts index eb1907d1c..d4abd6dc2 100644 --- a/packages/apps/src/plugins/http/http-server.ts +++ b/packages/apps/src/http/http-server.ts @@ -6,7 +6,7 @@ import { import { ILogger } from '@microsoft/teams.common'; -import { IActivityEvent } from '../../events'; +import { IActivityEvent } from '../events'; import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; @@ -14,10 +14,33 @@ export type HttpServerOptions = { readonly skipAuth?: boolean; }; +/** + * Interface for HTTP server - exposed to plugins + */ +export interface IHttpServer { + /** + * Get the underlying adapter + * Useful for plugins that need adapter-specific features + */ + readonly adapter: IHttpAdapter; + + /** + * Register a route with the HTTP server + * Framework-agnostic way to add routes + */ + registerRoute(config: IRouteConfig): void; + + /** + * Serve static files from a directory + * Useful for plugins that need to serve UI assets + */ + serveStatic(path: string, directory: string): void; +} + /** * Configurable HTTP server for receiving Teams activities */ -export class HttpServer { +export class HttpServer implements IHttpServer { /** * Callback invoked when a valid activity request arrives * App should set this to process activities diff --git a/packages/apps/src/http-stream.spec.ts b/packages/apps/src/http/http-stream.spec.ts similarity index 100% rename from packages/apps/src/http-stream.spec.ts rename to packages/apps/src/http/http-stream.spec.ts diff --git a/packages/apps/src/http-stream.ts b/packages/apps/src/http/http-stream.ts similarity index 98% rename from packages/apps/src/http-stream.ts rename to packages/apps/src/http/http-stream.ts index 2ae507c6c..01ad1bfa4 100644 --- a/packages/apps/src/http-stream.ts +++ b/packages/apps/src/http/http-stream.ts @@ -13,8 +13,8 @@ import { } from '@microsoft/teams.api'; import { ConsoleLogger, EventEmitter, ILogger } from '@microsoft/teams.common'; -import { IStreamer, IStreamerEvents } from './types'; -import { promises } from './utils'; +import { IStreamer, IStreamerEvents } from '../types'; +import { promises } from '../utils'; /** * HTTP-based streaming implementation for Microsoft Teams activities. diff --git a/packages/apps/src/http/index.ts b/packages/apps/src/http/index.ts new file mode 100644 index 000000000..c651754e0 --- /dev/null +++ b/packages/apps/src/http/index.ts @@ -0,0 +1,4 @@ +export * from './adapter'; +export * from './express-adapter'; +export { IHttpServer } from './http-server'; +export * from './http-stream'; diff --git a/packages/apps/src/index.ts b/packages/apps/src/index.ts index e58521538..f2ef5731d 100644 --- a/packages/apps/src/index.ts +++ b/packages/apps/src/index.ts @@ -5,3 +5,7 @@ export * from './contexts'; export * from './oauth'; export * from './events'; export * as manifest from './manifest'; + +export { IHttpAdapter, IRouteConfig } from './http/adapter'; +export { ExpressAdapter } from './http/express-adapter'; +export { IHttpServer } from './http/http-server'; diff --git a/packages/apps/src/plugins/http/index.ts b/packages/apps/src/plugins/http/index.ts index 2517e18b5..1110b6451 100644 --- a/packages/apps/src/plugins/http/index.ts +++ b/packages/apps/src/plugins/http/index.ts @@ -1,4 +1 @@ export * from './plugin'; -export * from './http-server'; -export * from './adapter'; -export * from './express-adapter'; diff --git a/packages/apps/src/plugins/http/plugin.spec.ts b/packages/apps/src/plugins/http/plugin.spec.ts index 6a952e1e7..83f87b7ff 100644 --- a/packages/apps/src/plugins/http/plugin.spec.ts +++ b/packages/apps/src/plugins/http/plugin.spec.ts @@ -1,8 +1,8 @@ import http from 'http'; import { App } from '../../app'; +import { HttpServer } from '../../http/http-server'; -import { HttpServer } from './http-server'; import { HttpPlugin } from './plugin'; describe('HttpPlugin', () => { diff --git a/packages/apps/src/plugins/http/plugin.ts b/packages/apps/src/plugins/http/plugin.ts index 2b27242fd..8ec4f07db 100644 --- a/packages/apps/src/plugins/http/plugin.ts +++ b/packages/apps/src/plugins/http/plugin.ts @@ -3,11 +3,10 @@ import http from 'http'; import express from 'express'; import pkg from '../../../package.json'; +import { ExpressAdapter } from '../../http'; +import { HttpServer } from '../../http/http-server'; import { Plugin } from '../../types'; -import { ExpressAdapter } from './express-adapter'; -import { HttpServer } from './http-server'; - /** * @deprecated Will be deprecated. Use HttpServer instead: * new App({ server: new HttpServer(new ExpressAdapter()) }) diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index 16080a755..83dea01b6 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -12,7 +12,7 @@ import { Dependency, Event, ExpressAdapter, - HttpServer, + IHttpServer, IActivityEvent, IErrorEvent, IPlugin, @@ -43,7 +43,7 @@ export class BotBuilderPlugin implements IPlugin { declare readonly client: $http.Client; @Dependency() - declare readonly httpServer: HttpServer; + declare readonly httpServer: IHttpServer; @Dependency() declare readonly manifest: Partial; From 38972dedfb8312eb7a2d3d2f84eabd91ff9a00e0 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Tue, 20 Jan 2026 10:59:16 -0800 Subject: [PATCH 05/33] Fix --- packages/apps/src/http/index.ts | 6 +++--- packages/apps/src/index.ts | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/apps/src/http/index.ts b/packages/apps/src/http/index.ts index c651754e0..79c339cd9 100644 --- a/packages/apps/src/http/index.ts +++ b/packages/apps/src/http/index.ts @@ -1,4 +1,4 @@ -export * from './adapter'; -export * from './express-adapter'; +// Public API exports +export { IHttpAdapter, IRouteConfig, IRequestHelpers } from './adapter'; +export { ExpressAdapter } from './express-adapter'; export { IHttpServer } from './http-server'; -export * from './http-stream'; diff --git a/packages/apps/src/index.ts b/packages/apps/src/index.ts index f2ef5731d..a4b22701c 100644 --- a/packages/apps/src/index.ts +++ b/packages/apps/src/index.ts @@ -6,6 +6,5 @@ export * from './oauth'; export * from './events'; export * as manifest from './manifest'; -export { IHttpAdapter, IRouteConfig } from './http/adapter'; -export { ExpressAdapter } from './http/express-adapter'; -export { IHttpServer } from './http/http-server'; +// HTTP infrastructure - public API +export * from './http'; From f5230f5087ea0351768f67a478e6869d5252ac76 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Tue, 20 Jan 2026 14:15:45 -0800 Subject: [PATCH 06/33] Jwt Validation --- packages/apps/src/http/http-server.ts | 45 ++++++++-- packages/apps/src/plugins/http/plugin.spec.ts | 90 ++++++++++++++++++- 2 files changed, 123 insertions(+), 12 deletions(-) diff --git a/packages/apps/src/http/http-server.ts b/packages/apps/src/http/http-server.ts index d4abd6dc2..a586fb892 100644 --- a/packages/apps/src/http/http-server.ts +++ b/packages/apps/src/http/http-server.ts @@ -7,6 +7,7 @@ import { import { ILogger } from '@microsoft/teams.common'; import { IActivityEvent } from '../events'; +import { createServiceTokenValidator, JwtValidator } from '../middleware/auth/jwt-validator'; import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; @@ -51,6 +52,7 @@ export class HttpServer implements IHttpServer { protected credentials?: Credentials; protected skipAuth: boolean; protected initialized: boolean = false; + protected jwtValidator?: JwtValidator; private _adapter: IHttpAdapter; @@ -84,6 +86,16 @@ export class HttpServer implements IHttpServer { this.logger = deps.logger; this.credentials = deps.credentials; + // Initialize JWT validator if credentials provided and auth not skipped + if (this.credentials && !this.skipAuth) { + this.jwtValidator = createServiceTokenValidator( + this.credentials.clientId, + this.credentials.tenantId, + undefined, // serviceUrl will be validated from activity body + this.logger + ); + } + // Framework-specific initialization (e.g., Next.js prepare) await this._adapter.initialize(); @@ -196,17 +208,34 @@ export class HttpServer implements IHttpServer { /** * Validate JWT token - * Uses existing withJwtValidation middleware logic + * Uses JwtValidator for proper Bot Framework token validation */ - protected async validateJwt(_authHeader: string, body: any): Promise { - // TODO: Implement proper JWT validation using withJwtValidation middleware - // For now, return a basic token with credentials info + protected async validateJwt(authHeader: string, body: any): Promise { + if (!this.jwtValidator) { + throw new Error('JWT validator not initialized - credentials required'); + } + + // Extract token from "Bearer " format + const token = authHeader.startsWith('Bearer ') + ? authHeader.substring(7) + : authHeader; + + // Validate token using service token validator + const payload = await this.jwtValidator.validateAccessToken(token, { + validateServiceUrl: body.serviceUrl ? { expectedServiceUrl: body.serviceUrl } : undefined + }); + + if (!payload) { + throw new Error('Invalid token'); + } + + // Convert JWT payload to IToken return { - appId: this.credentials?.clientId || '', + appId: payload.appid as string || this.credentials?.clientId || '', from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, + fromId: payload.sub as string || '', + serviceUrl: body.serviceUrl || payload.serviceurl as string || '', + isExpired: () => false, // Already validated by JWT validator }; } } diff --git a/packages/apps/src/plugins/http/plugin.spec.ts b/packages/apps/src/plugins/http/plugin.spec.ts index 83f87b7ff..2e59dc1f1 100644 --- a/packages/apps/src/plugins/http/plugin.spec.ts +++ b/packages/apps/src/plugins/http/plugin.spec.ts @@ -1,6 +1,7 @@ import http from 'http'; import { App } from '../../app'; +import { ExpressAdapter } from '../../http'; import { HttpServer } from '../../http/http-server'; import { HttpPlugin } from './plugin'; @@ -70,17 +71,98 @@ describe('HttpPlugin', () => { expect(app.http).toBe(plugin); expect(app.server).toBeDefined(); + expect(app.server).toBeInstanceOf(HttpServer); }); - it('should allow direct plugin usage', () => { + it('should pass skipAuth option through to server', () => { + const plugin = new HttpPlugin(undefined, { skipAuth: true }); + const app = new App({ + plugins: [plugin], + }); + + // Server should be configured with skipAuth + expect(app.server).toBeDefined(); + expect((app.server as any).skipAuth).toBe(true); + }); + + it('should pass custom http.Server through to adapter', () => { + const customServer = http.createServer(); + const plugin = new HttpPlugin(customServer); + const app = new App({ + plugins: [plugin], + }); + + // Server adapter should be using the custom server + const adapter = app.server.adapter as ExpressAdapter; + expect((adapter as any).server).toBe(customServer); + }); + + it('should work equivalently to new httpAdapter approach', () => { + // Old way with HttpPlugin + const oldPlugin = new HttpPlugin(); + const oldApp = new App({ + plugins: [oldPlugin], + }); + + // New way with httpAdapter + const newApp = new App({ + httpAdapter: new ExpressAdapter(), + }); + + // Both should have server + expect(oldApp.server).toBeInstanceOf(HttpServer); + expect(newApp.server).toBeInstanceOf(HttpServer); + + // Both should have adapter + expect(oldApp.server.adapter).toBeInstanceOf(ExpressAdapter); + expect(newApp.server.adapter).toBeInstanceOf(ExpressAdapter); + }); + + it('should expose deprecated app.http getter', () => { const plugin = new HttpPlugin(); + const app = new App({ + plugins: [plugin], + }); + + // Deprecated getter should work + expect(app.http).toBe(plugin); + + // But should be same underlying server + expect(app.http!.asServer()).toBe(app.server); + }); + + it('should allow direct plugin usage for adding routes', () => { + const plugin = new HttpPlugin(); + const mockHandler = jest.fn(); // Should be able to call Express methods directly + plugin.post('/custom-route', mockHandler); + + // Route should be registered on the underlying adapter + const adapter = plugin.asServer().adapter as ExpressAdapter; + expect(adapter).toBeDefined(); + }); + + it('should not conflict with other plugins', () => { + const plugin = new HttpPlugin(); + + const app = new App({ + plugins: [plugin], + }); + + // HttpPlugin should be registered + expect(app.http).toBe(plugin); + expect(app.server).toBeDefined(); + + // App should still be able to register routes const mockHandler = jest.fn(); - plugin.post('/test', mockHandler); + app.server.registerRoute({ + method: 'get', + path: '/test', + handler: mockHandler, + }); - // Verify it was registered (we can't easily test execution without starting server) - expect(mockHandler).toBeDefined(); + expect(app.server).toBeDefined(); }); }); From b57ffe86b5a3c73cce5077aa67ddeef02ff0e9b0 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Tue, 20 Jan 2026 14:55:20 -0800 Subject: [PATCH 07/33] HttpServer --- external/a2a/src/server/plugin.ts | 4 ++-- external/mcp/src/plugin.ts | 3 ++- packages/apps/src/app.ts | 23 +++++++------------ .../src/types/plugin/decorators/dependency.ts | 23 ++++++++++++++++++- .../apps/src/types/plugin/decorators/index.ts | 2 +- packages/botbuilder/src/plugin.ts | 3 ++- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/external/a2a/src/server/plugin.ts b/external/a2a/src/server/plugin.ts index 30006195b..9fb1e8353 100644 --- a/external/a2a/src/server/plugin.ts +++ b/external/a2a/src/server/plugin.ts @@ -14,10 +14,10 @@ import { A2AExpressApp } from '@a2a-js/sdk/server/express'; import express, { RequestHandler } from 'express'; import { - Dependency, EmitPluginEvent, Event, ExpressAdapter, + HttpServer, IHttpServer, IPlugin, Logger, @@ -77,7 +77,7 @@ export class A2APlugin implements IPlugin { @Event('custom') protected readonly emit!: EmitPluginEvent; - @Dependency() + @HttpServer() protected readonly httpServer!: IHttpServer; __eventType!: A2AEvents; diff --git a/external/mcp/src/plugin.ts b/external/mcp/src/plugin.ts index cd2782b5a..0be8f9248 100644 --- a/external/mcp/src/plugin.ts +++ b/external/mcp/src/plugin.ts @@ -14,6 +14,7 @@ import { IChatPrompt } from '@microsoft/teams.ai'; import { Dependency, ExpressAdapter, + HttpServer, IHttpServer, IPlugin, IPluginStartEvent, @@ -113,7 +114,7 @@ export class McpPlugin implements IPlugin { @Logger() readonly logger!: ILogger; - @Dependency() + @HttpServer() readonly httpServer!: IHttpServer; @Dependency({ optional: true }) diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index e545648df..f99d022f1 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -325,14 +325,8 @@ export class App { if (!server) { throw new Error('HttpPlugin.asServer() returned undefined'); } - } - // Explicit httpAdapter option - else if (this.options.httpAdapter) { - server = new HttpServer(this.options.httpAdapter, { skipAuth: this.options.skipAuth }); - } - // Default: create Express server - else { - server = new HttpServer(new ExpressAdapter(), { skipAuth: this.options.skipAuth }); + } else { + server = new HttpServer(this.options.httpAdapter ?? new ExpressAdapter(), { skipAuth: this.options.skipAuth }); } // Always set this.server @@ -399,21 +393,20 @@ export class App { * initialize the app. */ async initialize() { - // initialize server (register routes) - await this.server.initialize({ - logger: this.log, - credentials: this.credentials, - }); - // initialize plugins for (const plugin of this.plugins) { - // inject dependencies this.inject(plugin); if (plugin.onInit) { plugin.onInit(); } } + + // initialize server + await this.server.initialize({ + logger: this.log, + credentials: this.credentials, + }); } /** diff --git a/packages/apps/src/types/plugin/decorators/dependency.ts b/packages/apps/src/types/plugin/decorators/dependency.ts index 868e8092f..18097ecbe 100644 --- a/packages/apps/src/types/plugin/decorators/dependency.ts +++ b/packages/apps/src/types/plugin/decorators/dependency.ts @@ -69,6 +69,13 @@ export function Storage() { return Dependency({ name: 'IStorage' }); } +/** + * inject the `App` `IHttpServer` instance + */ +export function HttpServer() { + return Dependency({ name: 'IHttpServer' }); +} + /** * options for a plugins dependency * that should get injected into it @@ -83,6 +90,7 @@ export type DependencyOptions = | GraphTokenDependencyOptions | LoggerDependencyOptions | StorageDependencyOptions + | HttpServerDependencyOptions | PluginDependencyOptions; export type IdDependencyOptions = { @@ -189,13 +197,26 @@ export type StorageDependencyOptions = { readonly optional?: false; }; +export type HttpServerDependencyOptions = { + /** + * the name used to resolve the dependency + */ + readonly name: 'IHttpServer'; + + /** + * if optional, the app will not throw + * if the dependency is not found + */ + readonly optional?: false; +}; + export type PluginDependencyOptions = { /** * the name used to resolve the dependency */ readonly name?: Omit< string, - 'id' | 'name' | 'manifest' | 'credentials' | 'botToken' | 'graphToken' | 'ILogger' | 'IStorage' + 'id' | 'name' | 'manifest' | 'credentials' | 'botToken' | 'graphToken' | 'ILogger' | 'IStorage' | 'IHttpServer' >; /** diff --git a/packages/apps/src/types/plugin/decorators/index.ts b/packages/apps/src/types/plugin/decorators/index.ts index 0481bc06c..9822f8fa3 100644 --- a/packages/apps/src/types/plugin/decorators/index.ts +++ b/packages/apps/src/types/plugin/decorators/index.ts @@ -1,3 +1,3 @@ export { Plugin, PluginOptions } from './plugin'; -export { Dependency, DependencyOptions, Logger, Storage } from './dependency'; +export { Dependency, DependencyOptions, Logger, Storage, HttpServer } from './dependency'; export { Event } from './event'; diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index 83dea01b6..b28c9f8dc 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -12,6 +12,7 @@ import { Dependency, Event, ExpressAdapter, + HttpServer, IHttpServer, IActivityEvent, IErrorEvent, @@ -42,7 +43,7 @@ export class BotBuilderPlugin implements IPlugin { @Dependency() declare readonly client: $http.Client; - @Dependency() + @HttpServer() declare readonly httpServer: IHttpServer; @Dependency() From 7acbcbccf5b27930ebc9a11be748074fbe565566 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Wed, 21 Jan 2026 20:38:12 -0800 Subject: [PATCH 08/33] Logger --- packages/apps/src/app.ts | 6 ++++-- packages/apps/src/http/http-server.ts | 10 +++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index f99d022f1..83f5672a4 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -326,7 +326,10 @@ export class App { throw new Error('HttpPlugin.asServer() returned undefined'); } } else { - server = new HttpServer(this.options.httpAdapter ?? new ExpressAdapter(), { skipAuth: this.options.skipAuth }); + server = new HttpServer(this.options.httpAdapter ?? new ExpressAdapter(), { + skipAuth: this.options.skipAuth, + logger: this.log + }); } // Always set this.server @@ -404,7 +407,6 @@ export class App { // initialize server await this.server.initialize({ - logger: this.log, credentials: this.credentials, }); } diff --git a/packages/apps/src/http/http-server.ts b/packages/apps/src/http/http-server.ts index a586fb892..d8a20434d 100644 --- a/packages/apps/src/http/http-server.ts +++ b/packages/apps/src/http/http-server.ts @@ -4,7 +4,7 @@ import { IToken } from '@microsoft/teams.api'; -import { ILogger } from '@microsoft/teams.common'; +import { ConsoleLogger, ILogger } from '@microsoft/teams.common'; import { IActivityEvent } from '../events'; import { createServiceTokenValidator, JwtValidator } from '../middleware/auth/jwt-validator'; @@ -13,6 +13,7 @@ import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; export type HttpServerOptions = { readonly skipAuth?: boolean; + readonly logger?: ILogger; }; /** @@ -48,7 +49,7 @@ export class HttpServer implements IHttpServer { */ onRequest?: (event: IActivityEvent) => Promise; - protected logger!: ILogger; + protected logger: ILogger; protected credentials?: Credentials; protected skipAuth: boolean; protected initialized: boolean = false; @@ -67,6 +68,7 @@ export class HttpServer implements IHttpServer { constructor(adapter: IHttpAdapter, options?: HttpServerOptions) { this._adapter = adapter; this.skipAuth = options?.skipAuth ?? false; + this.logger = options?.logger ?? new ConsoleLogger('HttpServer'); } /** @@ -75,15 +77,13 @@ export class HttpServer implements IHttpServer { * Called by App.initialize() */ async initialize(deps: { - logger: ILogger; credentials?: Credentials; }) { if (this.initialized) { - this.logger?.debug('HttpServer already initialized, skipping'); + this.logger.debug('HttpServer already initialized, skipping'); return; } - this.logger = deps.logger; this.credentials = deps.credentials; // Initialize JWT validator if credentials provided and auth not skipped From ff52956a2cfad9734420950f6703e2d0138803cc Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Wed, 21 Jan 2026 22:58:29 -0800 Subject: [PATCH 09/33] Fix --- examples/http-adapters/README.md | 24 ++++-- examples/http-adapters/hono/hono-adapter.ts | 82 +++---------------- examples/http-adapters/hono/index.ts | 12 ++- .../http-adapters/nextjs/nextjs-adapter.ts | 42 +++++----- packages/apps/src/app.embed.ts | 4 +- packages/apps/src/app.spec.ts | 8 ++ packages/apps/src/http/adapter.ts | 26 +++--- packages/apps/src/http/express-adapter.ts | 31 ++++--- packages/apps/src/http/http-server.ts | 39 +++++++-- packages/apps/src/plugins/http/plugin.spec.ts | 2 +- 10 files changed, 131 insertions(+), 139 deletions(-) diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md index d78bdf83e..cdd698d73 100644 --- a/examples/http-adapters/README.md +++ b/examples/http-adapters/README.md @@ -168,26 +168,32 @@ All adapters implement the `IHttpAdapter` interface: ```typescript interface IHttpAdapter { /** - * Get the underlying HTTP server + * Register a route handler */ - getServer(): http.Server; + registerRouteHandler(config: IRouteConfig): void; /** - * Register a route handler + * Serve static files from a directory + * Primarily used for serving static files like for tabs */ - registerRoute(config: IRouteConfig): void; + serveStatic?(path: string, directory: string): void; /** - * Initialize the adapter (optional) - * Called before routes are registered + * Optional framework-specific initialization + * Called when app.initialize() or app.start() is invoked if any prep is needed */ initialize?(): Promise; /** - * Start the server (optional) - * Called when user calls app.start() or adapter.start() + * Start the server listening to incoming requests + * Not needed if app.start() is not called + */ + start?(port: number): Promise; + + /** + * Stop the server from listening and perform any cleanup that needs to be done */ - start?(port: number | string): Promise; + stop?(): Promise; } ``` diff --git a/examples/http-adapters/hono/hono-adapter.ts b/examples/http-adapters/hono/hono-adapter.ts index 15b6f17d8..649be984d 100644 --- a/examples/http-adapters/hono/hono-adapter.ts +++ b/examples/http-adapters/hono/hono-adapter.ts @@ -1,19 +1,20 @@ -import http from 'http'; import { Hono, Context } from 'hono'; import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adapter'; /** * Hono adapter for HttpServer * - * Handles Hono-specific HTTP framework concerns: - * - Accepts an existing Hono app (with your own routes) - * - Route registration via Hono routing (adds Teams bot routes) - * - Request/response data extraction and sending - * - Server lifecycle management + * Wraps an existing Hono app to add Teams bot routes. + * Server lifecycle (start/stop) is managed by the user externally. + * + * Usage: + * const hono = new Hono(); + * const app = new App({ httpAdapter: new HonoAdapter(hono) }); + * await app.initialize(); + * // Start your Hono server separately with serve() or @hono/node-server */ export class HonoAdapter implements IHttpAdapter { protected hono: Hono; - protected server: http.Server; /** * Create adapter with your existing Hono app @@ -21,14 +22,12 @@ export class HonoAdapter implements IHttpAdapter { */ constructor(hono: Hono) { this.hono = hono; - // Create server - will be attached in initialize() - this.server = http.createServer(); } /** - * Register a route with Hono + * Register a route handler with Hono */ - registerRoute(config: IRouteConfig): void { + registerRouteHandler(config: IRouteConfig): void { const { method, path, handler } = config; // Convert handler to Hono handler signature @@ -91,6 +90,8 @@ export class HonoAdapter implements IHttpAdapter { /** * Serve static files from a directory + * Note: For production, consider using Hono's built-in static middleware + * or a CDN for better performance */ serveStatic(path: string, directory: string): void { // Hono's static file serving @@ -105,63 +106,4 @@ export class HonoAdapter implements IHttpAdapter { } }); } - - /** - * Initialize - attach Hono request handler to Node.js server - */ - async initialize(): Promise { - // Simple approach: manually convert Node.js request to Web API Request - // This is what @hono/node-server does internally - this.server.on('request', async (req, res) => { - try { - const url = `http://${req.headers.host || 'localhost'}${req.url}`; - - // Read body as string for POST/PUT/PATCH - let bodyData: string | undefined; - if (req.method !== 'GET' && req.method !== 'HEAD') { - bodyData = await new Promise((resolve, reject) => { - let data = ''; - req.on('data', (chunk) => { data += chunk; }); - req.on('end', () => resolve(data)); - req.on('error', reject); - }); - } - - // Create Web API Request for Hono - const webRequest = new Request(url, { - method: req.method, - headers: req.headers as HeadersInit, - body: bodyData - }); - - // Call Hono's fetch - it will route through registered routes and parse JSON - const webResponse = await this.hono.fetch(webRequest); - - // Convert Web API Response to Node.js response - res.statusCode = webResponse.status; - webResponse.headers.forEach((value, key) => { - res.setHeader(key, value); - }); - const body = await webResponse.text(); - res.end(body); - } catch (err) { - console.error('Hono adapter error:', err); - res.statusCode = 500; - res.end(JSON.stringify({ error: 'Internal server error' })); - } - }); - } - - /** - * Start the server - */ - async start(port: number): Promise { - return new Promise((resolve, reject) => { - this.server.listen(port, () => { - resolve(); - }); - - this.server.once('error', reject); - }); - } } diff --git a/examples/http-adapters/hono/index.ts b/examples/http-adapters/hono/index.ts index c7cca5c4f..a461e33e3 100644 --- a/examples/http-adapters/hono/index.ts +++ b/examples/http-adapters/hono/index.ts @@ -1,5 +1,6 @@ import 'dotenv/config'; -import { app, adapter } from './teams-app'; +import { serve } from '@hono/node-server'; +import { app, hono } from './teams-app'; const port = parseInt(process.env.PORT || '3978', 10); @@ -9,8 +10,13 @@ async function main() { // Initialize teams.ts app - this adds /api/messages to your Hono app await app.initialize(); - // Start your Hono server - await adapter.start(port); + // If you wanted the App class to handle server lifecycle, your adapter would need to implement start / stop + // app.start().catch(console.error) + + serve({ + fetch: hono.fetch, + port + }); console.log(`✓ Server ready on http://localhost:${port}`); console.log(`\nYour Hono routes:`); diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts index ef50241bf..5b83476d0 100644 --- a/examples/http-adapters/nextjs/nextjs-adapter.ts +++ b/examples/http-adapters/nextjs/nextjs-adapter.ts @@ -14,13 +14,11 @@ import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adap export class NextjsAdapter implements IHttpAdapter { protected nextApp: ReturnType; protected server: http.Server; - protected isUserProvidedServer: boolean; protected routes: Map = new Map(); protected dev: boolean; protected requestHandlerAttached: boolean = false; constructor(server?: http.Server, options?: { dev?: boolean; dir?: string }) { - this.isUserProvidedServer = !!server; this.dev = options?.dev ?? process.env.NODE_ENV !== 'production'; // Create Next.js app @@ -29,22 +27,15 @@ export class NextjsAdapter implements IHttpAdapter { dir: options?.dir }); - // Always create or use the server in constructor - // ConfigurableHttpPlugin needs it immediately - if (server) { - // User-provided server - this.server = server; - } else { - // Create placeholder server now, will attach handlers in initialize() - this.server = http.createServer(); - } + // Create server + this.server = server || http.createServer(); } /** - * Register a route with the adapter + * Register a route handler with the adapter * Routes are stored and handled before Next.js gets the request */ - registerRoute(config: IRouteConfig): void { + registerRouteHandler(config: IRouteConfig): void { const key = `${config.method.toUpperCase()}:${config.path}`; this.routes.set(key, config); } @@ -122,17 +113,9 @@ export class NextjsAdapter implements IHttpAdapter { } /** - * Start the server - * Throws if server was user-provided + * Start the server listening on the specified port */ async start(port: number): Promise { - if (this.isUserProvidedServer) { - throw new Error( - 'Cannot call start() when server was provided by user. ' + - 'User should call server.listen() directly.' - ); - } - return new Promise((resolve, reject) => { this.server.listen(port, () => { resolve(); @@ -141,6 +124,21 @@ export class NextjsAdapter implements IHttpAdapter { }); } + /** + * Stop the server and close all connections + */ + async stop(): Promise { + return new Promise((resolve, reject) => { + this.server.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + /** * Parse request body */ diff --git a/packages/apps/src/app.embed.ts b/packages/apps/src/app.embed.ts index a01a41a07..5772b4def 100644 --- a/packages/apps/src/app.embed.ts +++ b/packages/apps/src/app.embed.ts @@ -22,7 +22,7 @@ export function func( const log = this.log.child('functions').child(name); const entraTokenValidator = this.entraTokenValidator; - this.server.registerRoute({ + this.server.registerRouteHandler({ method: 'post', path: `/api/functions/${name}`, handler: async (helpers) => { @@ -136,7 +136,7 @@ export function tab( // SPA fallback - serve index.html for sub-routes const indexPath = npath.join(path, 'index.html'); - this.server.registerRoute({ + this.server.registerRouteHandler({ method: 'get', path: `/tabs/${name}/*`, handler: async (helpers) => { diff --git a/packages/apps/src/app.spec.ts b/packages/apps/src/app.spec.ts index 0aa4be05d..8bc5064a0 100644 --- a/packages/apps/src/app.spec.ts +++ b/packages/apps/src/app.spec.ts @@ -52,6 +52,10 @@ describe('App', () => { }); }); + afterEach(async () => { + await app.stop(); + }); + it('should acquire bot token via TokenManager', async () => { const mockAcquireToken = jest.fn().mockResolvedValue({ accessToken: mockBotToken, @@ -112,6 +116,10 @@ describe('App', () => { describe('send', () => { let app: TestApp; + afterEach(async () => { + await app.stop(); + }); + it('should send message without manifest.name configured', async () => { app = new TestApp({ clientId: 'test-client-id', diff --git a/packages/apps/src/http/adapter.ts b/packages/apps/src/http/adapter.ts index 86ac6f64a..c6969b284 100644 --- a/packages/apps/src/http/adapter.ts +++ b/packages/apps/src/http/adapter.ts @@ -37,27 +37,31 @@ export interface IHttpAdapter { * The adapter handles framework-specific routing logic and provides helpers to the handler * @param config Route configuration with method, path, and handler */ - registerRoute(config: IRouteConfig): void; + registerRouteHandler(config: IRouteConfig): void; /** * Serve static files from a directory + * Primarily used for serving static files like for tabs * @param path URL path prefix (e.g., '/static') * @param directory File system directory to serve from */ - serveStatic(path: string, directory: string): void; + serveStatic?(path: string, directory: string): void; /** - * Framework-specific initialization - * Called during HttpServer.ensureInitialized() - * Example: Next.js needs nextApp.prepare() - * Throw if not needed + * Optional framework-specific initialization + * Called when app.initialize() or app.start() is invoked if any prep is needed */ - initialize(): Promise; + initialize?(): Promise; /** - * Start the server - * Called during HttpServer.start() - * Throw if server is user-provided and cannot be started + * Start the server listening to incoming requests + * Not needed if app.start() is not called + * @param port Port number to listen on */ - start(port: number): Promise; + start?(port: number): Promise; + + /** + * Stop the server from listening and perform any cleanup that needs to be done + */ + stop?(): Promise; } diff --git a/packages/apps/src/http/express-adapter.ts b/packages/apps/src/http/express-adapter.ts index 07f85613e..ebdaf2808 100644 --- a/packages/apps/src/http/express-adapter.ts +++ b/packages/apps/src/http/express-adapter.ts @@ -26,10 +26,8 @@ export class ExpressAdapter implements IHttpAdapter { protected express: express.Application; protected server: http.Server; - protected isUserProvidedServer: boolean; constructor(server?: http.Server) { - this.isUserProvidedServer = !!server; this.express = express(); this.server = server || http.createServer(); this.server.on('request', this.express); @@ -49,9 +47,9 @@ export class ExpressAdapter implements IHttpAdapter { } /** - * Register a route with Express + * Register a route handler with Express */ - registerRoute(config: IRouteConfig): void { + registerRouteHandler(config: IRouteConfig): void { const { method, path, handler } = config; // Convert handler to Express middleware signature @@ -107,17 +105,9 @@ export class ExpressAdapter implements IHttpAdapter { } /** - * Start the server - * Throws if server was user-provided + * Start the server listening on the specified port */ async start(port: number): Promise { - if (this.isUserProvidedServer) { - throw new Error( - 'Cannot call start() when server was provided by user. ' + - 'User should call server.listen() directly.' - ); - } - return new Promise((resolve, reject) => { this.server.listen(port, () => { resolve(); @@ -132,4 +122,19 @@ export class ExpressAdapter implements IHttpAdapter { serveStatic(path: string, directory: string): void { this.express.use(path, express.static(directory)); } + + /** + * Stop the server and close all connections + */ + async stop(): Promise { + return new Promise((resolve, reject) => { + this.server.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } } diff --git a/packages/apps/src/http/http-server.ts b/packages/apps/src/http/http-server.ts index d8a20434d..87a3daa17 100644 --- a/packages/apps/src/http/http-server.ts +++ b/packages/apps/src/http/http-server.ts @@ -27,10 +27,10 @@ export interface IHttpServer { readonly adapter: IHttpAdapter; /** - * Register a route with the HTTP server + * Register a route handler with the HTTP server * Framework-agnostic way to add routes */ - registerRoute(config: IRouteConfig): void; + registerRouteHandler(config: IRouteConfig): void; /** * Serve static files from a directory @@ -97,10 +97,12 @@ export class HttpServer implements IHttpServer { } // Framework-specific initialization (e.g., Next.js prepare) - await this._adapter.initialize(); + if (this._adapter.initialize) { + await this._adapter.initialize(); + } // Register Teams bot endpoint - this._adapter.registerRoute({ + this._adapter.registerRouteHandler({ method: 'post', path: '/api/messages', handler: async (helpers) => { @@ -117,16 +119,35 @@ export class HttpServer implements IHttpServer { */ async start(port: number | string) { const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; + if (!this._adapter.start) { + throw new Error( + 'Adapter does not implement start(). ' + + 'Either implement start() in your adapter, or manage server lifecycle manually.' + ); + } await this._adapter.start(portNumber); this.logger.info(`listening on port ${port} 🚀`); } /** - * Register a route with the adapter + * Stop the HTTP server + * Called by App.stop() if implemented + */ + async stop() { + if (!this._adapter.stop) { + this.logger.warn('Adapter does not implement stop(). Skipping server shutdown.'); + return; + } + await this._adapter.stop(); + this.logger.info('server stopped'); + } + + /** + * Register a route handler with the adapter * Used by app.function() and other app methods */ - registerRoute(config: IRouteConfig) { - this._adapter.registerRoute(config); + registerRouteHandler(config: IRouteConfig) { + this._adapter.registerRouteHandler(config); } /** @@ -134,7 +155,9 @@ export class HttpServer implements IHttpServer { * Used by app.tab() and other app methods */ serveStatic(path: string, directory: string) { - this._adapter.serveStatic(path, directory); + if (this._adapter.serveStatic) { + this._adapter.serveStatic(path, directory); + } } diff --git a/packages/apps/src/plugins/http/plugin.spec.ts b/packages/apps/src/plugins/http/plugin.spec.ts index 2e59dc1f1..9b5c81cfe 100644 --- a/packages/apps/src/plugins/http/plugin.spec.ts +++ b/packages/apps/src/plugins/http/plugin.spec.ts @@ -156,7 +156,7 @@ describe('HttpPlugin', () => { // App should still be able to register routes const mockHandler = jest.fn(); - app.server.registerRoute({ + app.server.registerRouteHandler({ method: 'get', path: '/test', handler: mockHandler, From fee1672623e7dfcd09fe02c9961af5f83172ce24 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 23 Jan 2026 10:47:57 -0800 Subject: [PATCH 10/33] Fix tests --- packages/apps/src/app.plugin.spec.ts | 51 ++++++++++++------------- packages/apps/src/app.process.spec.ts | 3 +- packages/apps/src/app.spec.ts | 6 +++ packages/apps/src/test-utils.ts | 55 +++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 packages/apps/src/test-utils.ts diff --git a/packages/apps/src/app.plugin.spec.ts b/packages/apps/src/app.plugin.spec.ts index 3b1a20fb1..1c72a2a18 100644 --- a/packages/apps/src/app.plugin.spec.ts +++ b/packages/apps/src/app.plugin.spec.ts @@ -1,9 +1,7 @@ -import { MessageActivity } from '@microsoft/teams.api'; import { ConsoleLogger } from '@microsoft/teams.common/logging'; -import { App } from './app'; import { IErrorEvent } from './events'; -import { HttpPlugin } from './plugins'; +import { createTestApp } from './test-utils'; import { EmitPluginEvent, IPlugin, IPluginActivityEvent, IPluginStartEvent } from './types'; import { Event, Plugin } from './types/plugin/decorators'; @@ -14,16 +12,6 @@ interface ITestEvents { } } -class TestHttpPlugin extends HttpPlugin { - async onStart(_event: IPluginStartEvent) { - // No-op for tests - } - - async onStop() { - // No-op for tests - } -} - @Plugin({ name: 'testPlugin', version: '0.0.1', @@ -49,9 +37,9 @@ describe('app.plugin', () => { it('plugins should be able to emit events that reach the app', async () => { // Create an App with our test plugin const testPlugin = new TestPlugin(); - const app = new App({ + const app = createTestApp({ logger: new ConsoleLogger('test', { level: 'debug' }), - plugins: [testPlugin, new TestHttpPlugin()] + plugins: [testPlugin] }); let receivedEventMessage: string = ''; @@ -71,7 +59,7 @@ describe('app.plugin', () => { it('should throw error when registering duplicate plugin names', () => { const plugin1 = new TestPlugin(); const plugin2 = new TestPlugin(); - const app = new App({ + const app = createTestApp({ logger: new ConsoleLogger('test', { level: 'debug' }), plugins: [plugin1] }); @@ -103,7 +91,7 @@ describe('app.plugin', () => { } } - const app = new App({ + const app = createTestApp({ logger: new ConsoleLogger('test', { level: 'debug' }), plugins: [new ReservedEventPlugin()] }); @@ -116,6 +104,8 @@ describe('app.plugin', () => { plugin.testEmit(); expect(eventFn).not.toHaveBeenCalled(); + + await app.stop(); }); it('should call plugin lifecycle methods in correct order', async () => { @@ -141,9 +131,9 @@ describe('app.plugin', () => { } } - const app = new App({ + const app = createTestApp({ logger: new ConsoleLogger('test', { level: 'debug' }), - plugins: [new LifecyclePlugin(), new TestHttpPlugin()] + plugins: [new LifecyclePlugin()] }); await app.start(); @@ -164,9 +154,9 @@ describe('app.plugin', () => { } } - const app = new App({ + const app = createTestApp({ logger: new ConsoleLogger('test', { level: 'debug' }), - plugins: [new ErrorPlugin(), new TestHttpPlugin()] + plugins: [new ErrorPlugin()] }); let errorReceived = null as Error | null; @@ -178,7 +168,10 @@ describe('app.plugin', () => { expect(errorReceived).toBeDefined(); expect(errorReceived?.message).toBe('test error'); + + await app.stop(); }); + it('should be able to include additional context', async () => { interface IMyContext { foo: number; @@ -203,9 +196,9 @@ describe('app.plugin', () => { } } - const app = new App({ + const app = createTestApp({ logger: new ConsoleLogger('test', { level: 'debug' }), - plugins: [new MyPlugin(), new TestHttpPlugin()] + plugins: [new MyPlugin()] }); @@ -219,10 +212,16 @@ describe('app.plugin', () => { await app.start(); // Trigger a message activity by directly calling onActivity (internal API for testing) - const activity = new MessageActivity('test message'); - await app.onActivity({ - body: activity.toInterface(), + body: { + type: 'message', + text: 'test message', + from: { id: 'user-id', name: 'Test User' }, + recipient: { id: 'bot-id', name: 'Bot' }, + conversation: { id: 'conv-id' }, + channelId: 'test', + serviceUrl: 'https://test.botframework.com' + }, token: { appId: 'test-app-id', serviceUrl: 'https://test.botframework.com', diff --git a/packages/apps/src/app.process.spec.ts b/packages/apps/src/app.process.spec.ts index 130e28c78..874d89a69 100644 --- a/packages/apps/src/app.process.spec.ts +++ b/packages/apps/src/app.process.spec.ts @@ -2,6 +2,7 @@ import { IMessageActivity, InvokeResponse, ITaskFetchInvokeActivity, IToken, Mes import { App } from './app'; import { IActivityEvent } from './events/activity'; +import { createTestApp } from './test-utils'; describe('App', () => { let app: App; @@ -16,7 +17,7 @@ describe('App', () => { const activity: IMessageActivity = new MessageActivity(); beforeEach(() => { - app = new App(); + app = createTestApp(); app.start(); }); diff --git a/packages/apps/src/app.spec.ts b/packages/apps/src/app.spec.ts index 8bc5064a0..314c0dba5 100644 --- a/packages/apps/src/app.spec.ts +++ b/packages/apps/src/app.spec.ts @@ -3,6 +3,7 @@ import jwt from 'jsonwebtoken'; import { JsonWebToken } from '@microsoft/teams.api'; import { App } from './app'; +import { TestAdapter } from './test-utils'; class TestApp extends App { // Expose protected members for testing @@ -46,6 +47,7 @@ describe('App', () => { beforeEach(() => { app = new TestApp({ + httpAdapter: new TestAdapter(), clientId: 'test-client-id', clientSecret: 'test-client-secret', tenantId: 'test-tenant-id', @@ -90,6 +92,7 @@ describe('App', () => { it('should return null when credentials are not provided', async () => { const appWithoutCreds = new TestApp({ + httpAdapter: new TestAdapter() }); const botToken = await appWithoutCreds.testGetBotToken(); @@ -122,6 +125,7 @@ describe('App', () => { it('should send message without manifest.name configured', async () => { app = new TestApp({ + httpAdapter: new TestAdapter(), clientId: 'test-client-id', clientSecret: 'test-client-secret', tenantId: 'test-tenant-id', @@ -143,6 +147,7 @@ describe('App', () => { it('should send message with manifest.name configured', async () => { app = new TestApp({ + httpAdapter: new TestAdapter(), clientId: 'test-client-id', clientSecret: 'test-client-secret', tenantId: 'test-tenant-id', @@ -167,6 +172,7 @@ describe('App', () => { it('should throw error when app is not started (no clientId)', async () => { app = new TestApp({ + httpAdapter: new TestAdapter() }); await app.start(); diff --git a/packages/apps/src/test-utils.ts b/packages/apps/src/test-utils.ts new file mode 100644 index 000000000..d2beb04a5 --- /dev/null +++ b/packages/apps/src/test-utils.ts @@ -0,0 +1,55 @@ +/** + * Test utilities for creating Apps in test environments + */ + +import { App, AppOptions } from './app'; +import { IHttpAdapter, IRouteConfig } from './http/adapter'; +import { IPlugin } from './types'; + +/** + * Mock HTTP adapter for testing + * Provides no-op implementations for all methods + */ +export class TestAdapter implements IHttpAdapter { + registerRouteHandler(_config: IRouteConfig): void { + // No-op for tests + } + + serveStatic(_path: string, _directory: string): void { + // No-op for tests + } + + async initialize(): Promise { + // No-op for tests + } + + async start(_port: number): Promise { + // No-op for tests + } + + async stop(): Promise { + // No-op for tests + } +} + +/** + * Creates an App instance configured for testing + * Automatically uses TestAdapter if no httpAdapter is provided + * + * @param options App configuration options + * @returns App instance with TestAdapter + * + * @example + * const app = createTestApp({ + * clientId: 'test-client-id', + * clientSecret: 'test-client-secret' + * }); + */ +export function createTestApp( + options?: AppOptions +): App { + return new App({ + ...options, + httpAdapter: options?.httpAdapter ?? new TestAdapter() + }); +} From 235c20284e3d5369ffd3f3bfbc90046fc2c92d93 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Wed, 10 Dec 2025 14:20:18 -0800 Subject: [PATCH 11/33] Update --- ...local.yml.hbs => m365agents.local.yml.hbs} | 23 +++++++++++-------- ...p.testtool.yml => m365agents.testtool.yml} | 7 +++--- .../{teamsapp.yml.hbs => m365agents.yml.hbs} | 11 +++++---- 3 files changed, 24 insertions(+), 17 deletions(-) rename packages/cli/configs/atk/basic/python/{teamsapp.local.yml.hbs => m365agents.local.yml.hbs} (79%) rename packages/cli/configs/atk/basic/python/{teamsapp.testtool.yml => m365agents.testtool.yml} (77%) rename packages/cli/configs/atk/basic/python/{teamsapp.yml.hbs => m365agents.yml.hbs} (94%) diff --git a/packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs b/packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs similarity index 79% rename from packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs rename to packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs index 69bf43d53..b0f44ac31 100644 --- a/packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs +++ b/packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs @@ -1,11 +1,11 @@ -# yaml-language-server: $schema=https://aka.ms/teams-toolkit/1.0.0/yaml.schema.json +# yaml-language-server: $schema=https://aka.ms/m365-agents-toolkits/v1.11/yaml.schema.json # -# The teamsapp.local.yml composes automation tasks for M365 Agents Toolkit when running locally. +# The m365agents.local.yml composes automation tasks for M365 Agents Toolkit when running locally. # This file is used when running Start Debugging (F5) from Visual Studio Code or with the TeamsFx CLI commands. # i.e. `teamsfx provision --env local` or `teamsfx deploy --env local`. # # You can customize this file. Visit https://aka.ms/teamsfx-v5.0-guide for more info about M365 Agents Toolkit project files. -version: 1.0.0 +version: v1.11 environmentFolderPath: ./env @@ -19,14 +19,18 @@ provision: writeToEnvironmentFile: teamsAppId: TEAMS_APP_ID - # Automates the creation an Azure AD app registration which is required for a bot. - # The Bot ID (AAD app client ID) and Bot Password (AAD app client secret) are saved to an environment file. - - uses: botAadApp/create + # Create or reuse an existing Microsoft Entra application for bot. + - uses: aadApp/create with: name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} + generateClientSecret: true + generateServicePrincipal: true + signInAudience: AzureADMultipleOrgs writeToEnvironmentFile: - botId: BOT_ID - botPassword: SECRET_BOT_PASSWORD + clientId: BOT_ID + clientSecret: SECRET_BOT_PASSWORD + objectId: BOT_OBJECT_ID + tenantId: AAD_APP_TENANT_ID # Automates the creation and configuration of a Bot Framework registration which is required for a bot. # This configures the bot to use the Azure AD app registration created in the previous step. @@ -50,7 +54,7 @@ provision: with: manifestPath: ./appPackage/manifest.json outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - outputJsonPath: ./appPackage/build/manifest.$\{{TEAMSFX_ENV}}.json + outputFolder: ./appPackage/build # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. # This action ensures that any manifest changes are reflected when launching the app again in Teams. @@ -67,3 +71,4 @@ deploy: PORT: 3978 CLIENT_ID: $\{{BOT_ID}} CLIENT_SECRET: $\{{SECRET_BOT_PASSWORD}} + TENANT_ID: $\{{TEAMS_APP_TENANT_ID}} diff --git a/packages/cli/configs/atk/basic/python/teamsapp.testtool.yml b/packages/cli/configs/atk/basic/python/m365agents.testtool.yml similarity index 77% rename from packages/cli/configs/atk/basic/python/teamsapp.testtool.yml rename to packages/cli/configs/atk/basic/python/m365agents.testtool.yml index d25ef0c11..085eca5fe 100644 --- a/packages/cli/configs/atk/basic/python/teamsapp.testtool.yml +++ b/packages/cli/configs/atk/basic/python/m365agents.testtool.yml @@ -1,7 +1,7 @@ -# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.5/yaml.schema.json +# yaml-language-server: $schema=https://aka.ms/m365-agents-toolkits/v1.9/yaml.schema.json # Visit https://aka.ms/teamsfx-v5.0-guide for details on this file # Visit https://aka.ms/teamsfx-actions for details on actions -version: v1.5 +version: v1.9 deploy: # Install development tool(s) @@ -16,6 +16,7 @@ deploy: with: target: ./.env envs: - PYTHON_ENV: local PORT: 3978 TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} + CLIENT_ID: "" + CLIENT_SECRET: "" diff --git a/packages/cli/configs/atk/basic/python/teamsapp.yml.hbs b/packages/cli/configs/atk/basic/python/m365agents.yml.hbs similarity index 94% rename from packages/cli/configs/atk/basic/python/teamsapp.yml.hbs rename to packages/cli/configs/atk/basic/python/m365agents.yml.hbs index fba0c4ff9..94765fc18 100644 --- a/packages/cli/configs/atk/basic/python/teamsapp.yml.hbs +++ b/packages/cli/configs/atk/basic/python/m365agents.yml.hbs @@ -1,12 +1,12 @@ -# yaml-language-server: $schema=https://aka.ms/teams-toolkit/1.0.0/yaml.schema.json +# yaml-language-server: $schema=https://aka.ms/m365-agents-toolkits/v1.9/yaml.schema.json # -# The teamsapp.yml composes automation tasks for M365 Agents Toolkit when running other environment configurations. +# The m365agents.yml composes automation tasks for M365 Agents Toolkit when running other environment configurations. # This file is used when selecting the Provision, Deploy, or Publish menu items in the M365 Agents Toolkit for Visual Studio Code window # or with the TeamsFx CLI commands. # i.e. `teamsfx provision --env {environment name}` or `teamsfx deploy --env {environment name}`. # # You can customize this file. Visit https://aka.ms/teamsfx-v5.0-guide for more info about M365 Agents Toolkit project files. -version: 1.0.0 +version: v1.9 environmentFolderPath: ./env @@ -31,6 +31,7 @@ provision: name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} # If the value is false, the driver will not generate client secret for you generateClientSecret: true + generateServicePrincipal: true # organization's Microsoft Entra tenant (for example, single tenant). signInAudience: AzureADMultipleOrgs # Write the information of created resources into environment file for the @@ -78,7 +79,7 @@ provision: with: manifestPath: ./appPackage/manifest.json outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - outputJsonPath: ./appPackage/build/manifest.$\{{TEAMSFX_ENV}}.json + outputFolder: ./appPackage/build # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. - uses: teamsApp/validateAppPackage @@ -120,7 +121,7 @@ publish: with: manifestPath: ./appPackage/manifest.json outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - outputJsonPath: ./appPackage/build/manifest.$\{{TEAMSFX_ENV}}.json + outputFolder: ./appPackage/build # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. - uses: teamsApp/validateAppPackage From a66ba3337ced9585be8758ed4dfac947d4d436f8 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Mon, 15 Dec 2025 16:00:13 -0800 Subject: [PATCH 12/33] Separate activity sending from HTTP transport layer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous architecture tightly coupled HTTP transport concerns with activity sending logic: **Previous Architecture:** ``` HttpPlugin (transport) → implements ISender (sending) → has send() method (creates new Client per call) → has createStream() method → knows about Activity protocol details ActivityContext → depends on ISender plugin → cannot work without transport plugin → conflates transport and sending concerns ``` Key Issues: - HttpPlugin created NEW Client instances on every send() call - Transport plugins (HttpPlugin) were forced to implement send/createStream - Users couldn't "bring their own server" without implementing ISender - ActivityContext was tightly coupled to plugin architecture - HttpPlugin knew about Bot Framework Activity protocol details ``` HttpPlugin (transport) → only handles HTTP server/routing/auth → emits ICoreActivity (minimal protocol knowledge) → just passes body payload to app ActivitySender (NEW) → dedicated class for sending activities → receives injected, reusable Client → handles all send/stream logic → private to App class ActivityContext → uses send callback (abstraction) → receives pre-created stream → no direct dependency on ActivitySender ``` - Centralized all activity sending logic - Receives reusable Client in constructor (no per-send instantiation) - Private to App class - internal implementation detail - Provides send() and createStream() methods - Minimal fields transport layer needs: serviceUrl, id, type - Extensible via [key: string]: any for protocol-specific fields - Transport plugins work with this instead of full Activity type - Parsing to Activity happens in app.process.ts - No longer needed - plugins don't send activities - Plugins only handle transport (receiving requests) - Breaking change, but simplifies plugin architecture - Constructor accepts send callback function - Receives pre-created stream (not factory function) - No knowledge of ActivitySender implementation - Proper abstraction via dependency injection - Initially renamed to ActivityStream - Reverted because it's still HTTP-specific (uses Bot Framework HTTP Client API) - Moved from src/plugins/http/stream.ts to src/http-stream.ts - Still transport-specific, just not plugin-owned 1. **ISender removed** - Custom plugins should implement IPlugin only 2. **IActivityEvent changed** - Now has body: ICoreActivity instead of activity: Activity 3. **Plugin.onActivity** - Still receives parsed activity: Activity (unchanged) 4. **App.process signature** - Internal change, not exposed to plugin API Before: ```typescript class MyPlugin implements ISender { send(activity, ref) { ... } // Required createStream(ref) { ... } // Required async onRequest(req, res) { const activity: Activity = req.body; // Need Activity type await this.$onActivity({ activity, token }); } } ``` After: ```typescript class MyPlugin implements IPlugin { // No send() or createStream() needed! async onRequest(req, res) { // Just pass body - don't need Activity type knowledge await this.$onActivity({ body: req.body, // ICoreActivity (minimal fields) token }); } } ``` 1. **Client Reuse** - ActivitySender reuses same Client, no per-send instantiation 2. **Separation of Concerns** - Transport vs sending clearly separated 3. **Bring Your Own Server** - Easy to implement custom transports (Socket.io, gRPC, etc.) 4. **Less Protocol Knowledge** - Transport layer only needs ICoreActivity, not full Activity 5. **Cleaner Architecture** - Each class has single responsibility 6. **Better Abstraction** - ActivityContext uses callbacks, not direct dependencies - src/activity-sender.ts - Dedicated activity sending class - src/http-stream.ts - Moved from src/plugins/http/stream.ts - src/app.ts - Added activitySender, updated send() - src/app.process.ts - Removed sender param, uses activitySender - src/plugins/http/plugin.ts - Removed send/createStream, works with ICoreActivity - src/contexts/activity.ts - Uses callbacks instead of ISender plugin - src/events/activity.ts - Added ICoreActivity, changed to body field - src/types/plugin/sender.ts - Removed ISender, kept IActivitySender - src/plugins/http/stream.ts - Moved to src/http-stream.ts - ISender interface - Completely removed --- packages/apps/src/app.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index 83f5672a4..80eeeed52 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -421,11 +421,6 @@ export class App { try { await this.initialize(); - // Start HTTP server - if (this.server) { - await this.server.start(this.port); - } - // Start plugins for (const plugin of this.plugins) { if (plugin.onStart) { @@ -434,6 +429,9 @@ export class App { } this.events.emit('start', this.log); this.startedAt = new Date(); + + // Start HTTP server + await this.server.start(this.port); } catch (error: any) { this.onError({ error }); } From 15855e3607e448618966e7740fef1f064d870df2 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Wed, 14 Jan 2026 21:41:13 -0800 Subject: [PATCH 13/33] Revert --- .../atk/basic/python/teamsapp.local.yml.hbs | 69 +++++++++ .../atk/basic/python/teamsapp.testtool.yml | 21 +++ .../configs/atk/basic/python/teamsapp.yml.hbs | 134 ++++++++++++++++++ 3 files changed, 224 insertions(+) create mode 100644 packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs create mode 100644 packages/cli/configs/atk/basic/python/teamsapp.testtool.yml create mode 100644 packages/cli/configs/atk/basic/python/teamsapp.yml.hbs diff --git a/packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs b/packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs new file mode 100644 index 000000000..69bf43d53 --- /dev/null +++ b/packages/cli/configs/atk/basic/python/teamsapp.local.yml.hbs @@ -0,0 +1,69 @@ +# yaml-language-server: $schema=https://aka.ms/teams-toolkit/1.0.0/yaml.schema.json +# +# The teamsapp.local.yml composes automation tasks for M365 Agents Toolkit when running locally. +# This file is used when running Start Debugging (F5) from Visual Studio Code or with the TeamsFx CLI commands. +# i.e. `teamsfx provision --env local` or `teamsfx deploy --env local`. +# +# You can customize this file. Visit https://aka.ms/teamsfx-v5.0-guide for more info about M365 Agents Toolkit project files. +version: 1.0.0 + +environmentFolderPath: ./env + +# Defines what the `provision` lifecycle step does with M365 Agents Toolkit. +# Runs first during Start Debugging (F5) or run manually using `teamsfx provision --env local`. +provision: + # Automates the creation of a Teams app registration and saves the App ID to an environment file. + - uses: teamsApp/create + with: + name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} + writeToEnvironmentFile: + teamsAppId: TEAMS_APP_ID + + # Automates the creation an Azure AD app registration which is required for a bot. + # The Bot ID (AAD app client ID) and Bot Password (AAD app client secret) are saved to an environment file. + - uses: botAadApp/create + with: + name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} + writeToEnvironmentFile: + botId: BOT_ID + botPassword: SECRET_BOT_PASSWORD + + # Automates the creation and configuration of a Bot Framework registration which is required for a bot. + # This configures the bot to use the Azure AD app registration created in the previous step. + # M365 Agents Toolkit automatically creates a local Dev Tunnel URL and updates BOT_ENDPOINT when debugging (F5). + - uses: botFramework/create + with: + botId: $\{{BOT_ID}} + name: {{ toPascalCase name }} + messagingEndpoint: $\{{BOT_ENDPOINT}}/api/messages + description: '' + channels: + - name: msteams + + # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. + - uses: teamsApp/validateManifest + with: + manifestPath: ./appPackage/manifest.json + + # Automates the creation of a Teams app package (.zip). + - uses: teamsApp/zipAppPackage + with: + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.$\{{TEAMSFX_ENV}}.json + + # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. + # This action ensures that any manifest changes are reflected when launching the app again in Teams. + - uses: teamsApp/update + with: + # Relative path to this file. This is the path for built zip file. + appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + +deploy: + - uses: file/createOrUpdateEnvironmentFile + with: + target: ./.env + envs: + PORT: 3978 + CLIENT_ID: $\{{BOT_ID}} + CLIENT_SECRET: $\{{SECRET_BOT_PASSWORD}} diff --git a/packages/cli/configs/atk/basic/python/teamsapp.testtool.yml b/packages/cli/configs/atk/basic/python/teamsapp.testtool.yml new file mode 100644 index 000000000..d25ef0c11 --- /dev/null +++ b/packages/cli/configs/atk/basic/python/teamsapp.testtool.yml @@ -0,0 +1,21 @@ +# yaml-language-server: $schema=https://aka.ms/teams-toolkit/v1.5/yaml.schema.json +# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file +# Visit https://aka.ms/teamsfx-actions for details on actions +version: v1.5 + +deploy: + # Install development tool(s) + - uses: devTool/install + with: + testTool: + version: ~0.2.1 + symlinkDir: ./devTools/teamsapptester + + # Generate runtime environment variables + - uses: file/createOrUpdateEnvironmentFile + with: + target: ./.env + envs: + PYTHON_ENV: local + PORT: 3978 + TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} diff --git a/packages/cli/configs/atk/basic/python/teamsapp.yml.hbs b/packages/cli/configs/atk/basic/python/teamsapp.yml.hbs new file mode 100644 index 000000000..fba0c4ff9 --- /dev/null +++ b/packages/cli/configs/atk/basic/python/teamsapp.yml.hbs @@ -0,0 +1,134 @@ +# yaml-language-server: $schema=https://aka.ms/teams-toolkit/1.0.0/yaml.schema.json +# +# The teamsapp.yml composes automation tasks for M365 Agents Toolkit when running other environment configurations. +# This file is used when selecting the Provision, Deploy, or Publish menu items in the M365 Agents Toolkit for Visual Studio Code window +# or with the TeamsFx CLI commands. +# i.e. `teamsfx provision --env {environment name}` or `teamsfx deploy --env {environment name}`. +# +# You can customize this file. Visit https://aka.ms/teamsfx-v5.0-guide for more info about M365 Agents Toolkit project files. +version: 1.0.0 + +environmentFolderPath: ./env + +# Defines what the `provision` lifecycle step does with M365 Agents Toolkit. +# Runs with the Provision menu or CLI using `teamsfx provision --env {environment name}`. +provision: + # Automates the creation of a Teams app registration and saves the App ID to an environment file. + - uses: teamsApp/create + with: + name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} + writeToEnvironmentFile: + teamsAppId: TEAMS_APP_ID + + # Creates a new Microsoft Entra app to authenticate users if + # the environment variable that stores clientId is empty + - uses: aadApp/create + with: + # Note: when you run aadApp/update, the Microsoft Entra app name will be updated + # based on the definition in manifest. If you don't want to change the + # name, make sure the name in Microsoft Entra manifest is the same with the name + # defined here. + name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} + # If the value is false, the driver will not generate client secret for you + generateClientSecret: true + # organization's Microsoft Entra tenant (for example, single tenant). + signInAudience: AzureADMultipleOrgs + # Write the information of created resources into environment file for the + # specified environment variable(s). + writeToEnvironmentFile: + clientId: BOT_ID + # Environment variable that starts with `SECRET_` will be stored to the + # .env.{envName}.user environment file + clientSecret: SECRET_BOT_PASSWORD + objectId: AAD_APP_OBJECT_ID + tenantId: AAD_APP_TENANT_ID + + - uses: arm/deploy # Deploy given ARM templates parallelly. + with: + # AZURE_SUBSCRIPTION_ID is a built-in environment variable, + # if its value is empty, TeamsFx will prompt you to select a subscription. + # Referencing other environment variables with empty values + # will skip the subscription selection prompt. + subscriptionId: $\{{AZURE_SUBSCRIPTION_ID}} + # AZURE_RESOURCE_GROUP_NAME is a built-in environment variable, + # if its value is empty, TeamsFx will prompt you to select or create one + # resource group. + # Referencing other environment variables with empty values + # will skip the resource group selection prompt. + resourceGroupName: $\{{AZURE_RESOURCE_GROUP_NAME}} + templates: + - path: ./infra/azure.bicep # Relative path to this file + # Relative path to this yaml file. + # Placeholders will be replaced with corresponding environment + # variable before ARM deployment. + parameters: ./infra/azure.parameters.json + # Required when deploying ARM template + deploymentName: Create-resources-for-bot + # M365 Agents Toolkit will download this bicep CLI version from github for you, + # will use bicep CLI in PATH if you remove this config. + bicepCliVersion: v0.9.1 + + # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. + - uses: teamsApp/validateManifest + with: + manifestPath: ./appPackage/manifest.json + + # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. + - uses: teamsApp/zipAppPackage + with: + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.$\{{TEAMSFX_ENV}}.json + + # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. + - uses: teamsApp/validateAppPackage + with: + appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + + # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. + # This action ensures that any manifest changes are reflected when launching the app again in Teams. + - uses: teamsApp/update + with: + appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + +deploy: + - uses: script + with: + run: | + uv sync + uv export --no-hashes -o src/requirements.txt + # Deploy to an Azure App Service using the zip file created in the provision step. + - uses: azureAppService/zipDeploy + with: + artifactFolder: src + ignoreFile: .webappignore + # This example uses the env var thats generated by the arm/deploy action. + # You can replace it with an existing Azure Resource ID or other + # custom environment variable. + resourceId: $\{{BOT_AZURE_APP_SERVICE_RESOURCE_ID}} + +# Defines what the `publish` lifecycle step does with M365 Agents Toolkit. +# Runs with the Deploy menu or CLI using `teamsfx publish --env {environment name}`. +publish: + # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. + - uses: teamsApp/validateManifest + with: + manifestPath: ./appPackage/manifest.json + + # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. + - uses: teamsApp/zipAppPackage + with: + manifestPath: ./appPackage/manifest.json + outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + outputJsonPath: ./appPackage/build/manifest.$\{{TEAMSFX_ENV}}.json + + # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. + - uses: teamsApp/validateAppPackage + with: + appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip + + # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. + # This action ensures that any manifest changes are reflected when launching the app again in Teams. + - uses: teamsApp/update + with: + appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip From d6582a960e5528fe16fb95967e582639738ee505 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Wed, 14 Jan 2026 21:42:34 -0800 Subject: [PATCH 14/33] Revert --- .../atk/basic/python/m365agents.local.yml.hbs | 74 ---------- .../atk/basic/python/m365agents.testtool.yml | 22 --- .../atk/basic/python/m365agents.yml.hbs | 135 ------------------ 3 files changed, 231 deletions(-) delete mode 100644 packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs delete mode 100644 packages/cli/configs/atk/basic/python/m365agents.testtool.yml delete mode 100644 packages/cli/configs/atk/basic/python/m365agents.yml.hbs diff --git a/packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs b/packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs deleted file mode 100644 index b0f44ac31..000000000 --- a/packages/cli/configs/atk/basic/python/m365agents.local.yml.hbs +++ /dev/null @@ -1,74 +0,0 @@ -# yaml-language-server: $schema=https://aka.ms/m365-agents-toolkits/v1.11/yaml.schema.json -# -# The m365agents.local.yml composes automation tasks for M365 Agents Toolkit when running locally. -# This file is used when running Start Debugging (F5) from Visual Studio Code or with the TeamsFx CLI commands. -# i.e. `teamsfx provision --env local` or `teamsfx deploy --env local`. -# -# You can customize this file. Visit https://aka.ms/teamsfx-v5.0-guide for more info about M365 Agents Toolkit project files. -version: v1.11 - -environmentFolderPath: ./env - -# Defines what the `provision` lifecycle step does with M365 Agents Toolkit. -# Runs first during Start Debugging (F5) or run manually using `teamsfx provision --env local`. -provision: - # Automates the creation of a Teams app registration and saves the App ID to an environment file. - - uses: teamsApp/create - with: - name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} - writeToEnvironmentFile: - teamsAppId: TEAMS_APP_ID - - # Create or reuse an existing Microsoft Entra application for bot. - - uses: aadApp/create - with: - name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} - generateClientSecret: true - generateServicePrincipal: true - signInAudience: AzureADMultipleOrgs - writeToEnvironmentFile: - clientId: BOT_ID - clientSecret: SECRET_BOT_PASSWORD - objectId: BOT_OBJECT_ID - tenantId: AAD_APP_TENANT_ID - - # Automates the creation and configuration of a Bot Framework registration which is required for a bot. - # This configures the bot to use the Azure AD app registration created in the previous step. - # M365 Agents Toolkit automatically creates a local Dev Tunnel URL and updates BOT_ENDPOINT when debugging (F5). - - uses: botFramework/create - with: - botId: $\{{BOT_ID}} - name: {{ toPascalCase name }} - messagingEndpoint: $\{{BOT_ENDPOINT}}/api/messages - description: '' - channels: - - name: msteams - - # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. - - uses: teamsApp/validateManifest - with: - manifestPath: ./appPackage/manifest.json - - # Automates the creation of a Teams app package (.zip). - - uses: teamsApp/zipAppPackage - with: - manifestPath: ./appPackage/manifest.json - outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - outputFolder: ./appPackage/build - - # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. - # This action ensures that any manifest changes are reflected when launching the app again in Teams. - - uses: teamsApp/update - with: - # Relative path to this file. This is the path for built zip file. - appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - -deploy: - - uses: file/createOrUpdateEnvironmentFile - with: - target: ./.env - envs: - PORT: 3978 - CLIENT_ID: $\{{BOT_ID}} - CLIENT_SECRET: $\{{SECRET_BOT_PASSWORD}} - TENANT_ID: $\{{TEAMS_APP_TENANT_ID}} diff --git a/packages/cli/configs/atk/basic/python/m365agents.testtool.yml b/packages/cli/configs/atk/basic/python/m365agents.testtool.yml deleted file mode 100644 index 085eca5fe..000000000 --- a/packages/cli/configs/atk/basic/python/m365agents.testtool.yml +++ /dev/null @@ -1,22 +0,0 @@ -# yaml-language-server: $schema=https://aka.ms/m365-agents-toolkits/v1.9/yaml.schema.json -# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file -# Visit https://aka.ms/teamsfx-actions for details on actions -version: v1.9 - -deploy: - # Install development tool(s) - - uses: devTool/install - with: - testTool: - version: ~0.2.1 - symlinkDir: ./devTools/teamsapptester - - # Generate runtime environment variables - - uses: file/createOrUpdateEnvironmentFile - with: - target: ./.env - envs: - PORT: 3978 - TEAMSFX_NOTIFICATION_STORE_FILENAME: ${{TEAMSFX_NOTIFICATION_STORE_FILENAME}} - CLIENT_ID: "" - CLIENT_SECRET: "" diff --git a/packages/cli/configs/atk/basic/python/m365agents.yml.hbs b/packages/cli/configs/atk/basic/python/m365agents.yml.hbs deleted file mode 100644 index 94765fc18..000000000 --- a/packages/cli/configs/atk/basic/python/m365agents.yml.hbs +++ /dev/null @@ -1,135 +0,0 @@ -# yaml-language-server: $schema=https://aka.ms/m365-agents-toolkits/v1.9/yaml.schema.json -# -# The m365agents.yml composes automation tasks for M365 Agents Toolkit when running other environment configurations. -# This file is used when selecting the Provision, Deploy, or Publish menu items in the M365 Agents Toolkit for Visual Studio Code window -# or with the TeamsFx CLI commands. -# i.e. `teamsfx provision --env {environment name}` or `teamsfx deploy --env {environment name}`. -# -# You can customize this file. Visit https://aka.ms/teamsfx-v5.0-guide for more info about M365 Agents Toolkit project files. -version: v1.9 - -environmentFolderPath: ./env - -# Defines what the `provision` lifecycle step does with M365 Agents Toolkit. -# Runs with the Provision menu or CLI using `teamsfx provision --env {environment name}`. -provision: - # Automates the creation of a Teams app registration and saves the App ID to an environment file. - - uses: teamsApp/create - with: - name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} - writeToEnvironmentFile: - teamsAppId: TEAMS_APP_ID - - # Creates a new Microsoft Entra app to authenticate users if - # the environment variable that stores clientId is empty - - uses: aadApp/create - with: - # Note: when you run aadApp/update, the Microsoft Entra app name will be updated - # based on the definition in manifest. If you don't want to change the - # name, make sure the name in Microsoft Entra manifest is the same with the name - # defined here. - name: {{ toPascalCase name }}$\{{APP_NAME_SUFFIX}} - # If the value is false, the driver will not generate client secret for you - generateClientSecret: true - generateServicePrincipal: true - # organization's Microsoft Entra tenant (for example, single tenant). - signInAudience: AzureADMultipleOrgs - # Write the information of created resources into environment file for the - # specified environment variable(s). - writeToEnvironmentFile: - clientId: BOT_ID - # Environment variable that starts with `SECRET_` will be stored to the - # .env.{envName}.user environment file - clientSecret: SECRET_BOT_PASSWORD - objectId: AAD_APP_OBJECT_ID - tenantId: AAD_APP_TENANT_ID - - - uses: arm/deploy # Deploy given ARM templates parallelly. - with: - # AZURE_SUBSCRIPTION_ID is a built-in environment variable, - # if its value is empty, TeamsFx will prompt you to select a subscription. - # Referencing other environment variables with empty values - # will skip the subscription selection prompt. - subscriptionId: $\{{AZURE_SUBSCRIPTION_ID}} - # AZURE_RESOURCE_GROUP_NAME is a built-in environment variable, - # if its value is empty, TeamsFx will prompt you to select or create one - # resource group. - # Referencing other environment variables with empty values - # will skip the resource group selection prompt. - resourceGroupName: $\{{AZURE_RESOURCE_GROUP_NAME}} - templates: - - path: ./infra/azure.bicep # Relative path to this file - # Relative path to this yaml file. - # Placeholders will be replaced with corresponding environment - # variable before ARM deployment. - parameters: ./infra/azure.parameters.json - # Required when deploying ARM template - deploymentName: Create-resources-for-bot - # M365 Agents Toolkit will download this bicep CLI version from github for you, - # will use bicep CLI in PATH if you remove this config. - bicepCliVersion: v0.9.1 - - # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. - - uses: teamsApp/validateManifest - with: - manifestPath: ./appPackage/manifest.json - - # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. - - uses: teamsApp/zipAppPackage - with: - manifestPath: ./appPackage/manifest.json - outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - outputFolder: ./appPackage/build - - # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. - - uses: teamsApp/validateAppPackage - with: - appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - - # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. - # This action ensures that any manifest changes are reflected when launching the app again in Teams. - - uses: teamsApp/update - with: - appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - -deploy: - - uses: script - with: - run: | - uv sync - uv export --no-hashes -o src/requirements.txt - # Deploy to an Azure App Service using the zip file created in the provision step. - - uses: azureAppService/zipDeploy - with: - artifactFolder: src - ignoreFile: .webappignore - # This example uses the env var thats generated by the arm/deploy action. - # You can replace it with an existing Azure Resource ID or other - # custom environment variable. - resourceId: $\{{BOT_AZURE_APP_SERVICE_RESOURCE_ID}} - -# Defines what the `publish` lifecycle step does with M365 Agents Toolkit. -# Runs with the Deploy menu or CLI using `teamsfx publish --env {environment name}`. -publish: - # Optional: Automates schema and error checking of the Teams app manifest and outputs the results in the console. - - uses: teamsApp/validateManifest - with: - manifestPath: ./appPackage/manifest.json - - # Automates creating a final app package (.zip) by replacing any variables in the manifest.json file for the current environment. - - uses: teamsApp/zipAppPackage - with: - manifestPath: ./appPackage/manifest.json - outputZipPath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - outputFolder: ./appPackage/build - - # Optional: Automates an app package check for errors that would prevent the app from being published and reports any problems. - - uses: teamsApp/validateAppPackage - with: - appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip - - # Automates updating the Teams app manifest in Teams Developer Portal using the App ID from the manifest file. - # This action ensures that any manifest changes are reflected when launching the app again in Teams. - - uses: teamsApp/update - with: - appPackagePath: ./appPackage/build/appPackage.$\{{TEAMSFX_ENV}}.zip From 6795d8261230c1aade48a795e36580a1a1941f6f Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Thu, 15 Jan 2026 22:57:37 -0800 Subject: [PATCH 15/33] Configurable Http Plugin --- package-lock.json | 71 ++++++ packages/apps/src/plugins/http/adapter.ts | 63 +++++ .../plugins/http/configurable-http-plugin.ts | 216 ++++++++++++++++++ .../apps/src/plugins/http/express-adapter.ts | 135 +++++++++++ packages/apps/src/plugins/http/index.ts | 3 + 5 files changed, 488 insertions(+) create mode 100644 packages/apps/src/plugins/http/adapter.ts create mode 100644 packages/apps/src/plugins/http/configurable-http-plugin.ts create mode 100644 packages/apps/src/plugins/http/express-adapter.ts diff --git a/package-lock.json b/package-lock.json index 0d6d5e0a0..872520a4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,33 @@ "typescript": "^5.4.5" } }, + "examples/adapters": { + "name": "@examples/adapters", + "version": "0.0.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "cors": "^2.8.5", + "express": "^4.21.0", + "hono": "^4.6.14", + "next": "^14.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/node": "^22.5.4", + "@types/react": "^18.2.0", + "dotenv": "^16.4.5", + "tsx": "^4.20.6", + "typescript": "^5.4.5" + } + }, "examples/ai": { "name": "@examples/ai", "version": "0.0.6", @@ -148,6 +175,28 @@ "typescript": "^5.4.5" } }, + "examples/express-adapter": { + "name": "@examples/express-adapter", + "version": "0.0.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "cors": "^2.8.5", + "express": "^4.21.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/node": "^22.5.4", + "dotenv": "^16.4.5", + "tsx": "^4.20.6", + "typescript": "^5.4.5" + } + }, "examples/graph": { "name": "@examples/auth", "version": "0.0.6", @@ -310,6 +359,28 @@ "typescript": "^5.4.5" } }, + "examples/nextjs": { + "name": "@examples/nextjs", + "version": "0.0.1", + "extraneous": true, + "license": "MIT", + "dependencies": { + "@microsoft/teams.api": "2.0.5", + "@microsoft/teams.apps": "2.0.5", + "@microsoft/teams.common": "2.0.5", + "next": "^14.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@microsoft/teams.config": "2.0.5", + "@types/node": "^22.5.4", + "@types/react": "^18.2.0", + "dotenv": "^16.4.5", + "tsx": "^4.20.6", + "typescript": "^5.4.5" + } + }, "examples/tab": { "name": "@examples/tab", "version": "0.0.6", diff --git a/packages/apps/src/plugins/http/adapter.ts b/packages/apps/src/plugins/http/adapter.ts new file mode 100644 index 000000000..5c4e66bb2 --- /dev/null +++ b/packages/apps/src/plugins/http/adapter.ts @@ -0,0 +1,63 @@ +import http from 'http'; + +/** + * Helpers provided to route handlers + */ +export interface IRequestHelpers { + /** + * Extract standardized request data from the framework request + */ + extractRequestData: () => { + body: any; + headers: Record; + }; + + /** + * Send standardized response using the framework response + */ + sendResponse: (response: { status: number; body: any }) => void; +} + +/** + * Configuration for registering a route with the adapter + */ +export interface IRouteConfig { + method: string; + path: string; + handler: (helpers: IRequestHelpers) => Promise; +} + +/** + * Adapter interface for different HTTP frameworks + * + * Adapters handle framework-specific HTTP concerns while ConfigurableHttpPlugin + * handles Teams protocol logic (JWT validation, activity processing, etc.) + */ +export interface IHttpAdapter { + /** + * Get the underlying HTTP server + * The adapter owns the server (creates it or accepts it from user) + */ + getServer(): http.Server; + + /** + * Register a route with the adapter + * The adapter handles framework-specific routing logic and provides helpers to the handler + * @param config Route configuration with method, path, and handler + */ + registerRoute(config: IRouteConfig): void; + + /** + * Optional: Framework-specific initialization + * Called during ConfigurableHttpPlugin.initialize() + * Example: Next.js needs nextApp.prepare() + */ + initialize?(): Promise; + + /** + * Optional: Start the server + * Called during ConfigurableHttpPlugin.start() + * Should throw error if server is user-provided + */ + start?(port: number): Promise; +} diff --git a/packages/apps/src/plugins/http/configurable-http-plugin.ts b/packages/apps/src/plugins/http/configurable-http-plugin.ts new file mode 100644 index 000000000..ede52e804 --- /dev/null +++ b/packages/apps/src/plugins/http/configurable-http-plugin.ts @@ -0,0 +1,216 @@ +import http from 'http'; + +import { + Credentials, + InvokeResponse, + IToken +} from '@microsoft/teams.api'; + +import { ILogger } from '@microsoft/teams.common'; + +import pkg from '../../../package.json'; +import { IActivityEvent, IErrorEvent } from '../../events'; +import { Manifest } from '../../manifest'; +import { + Dependency, + Event, + IPluginStartEvent, + Logger, + Plugin, +} from '../../types'; + +import { IHttpAdapter, IRequestHelpers } from './adapter'; + +/** + * Configurable HTTP plugin that works with different HTTP frameworks via adapters + * + * This plugin handles Teams protocol logic (JWT validation, activity processing) + * while delegating HTTP framework concerns to the adapter. + */ +@Plugin({ + name: 'http', + version: pkg.version, + description: 'Configurable HTTP plugin that works with different frameworks via adapters', +}) +export class ConfigurableHttpPlugin { + @Logger() + readonly logger!: ILogger; + + @Dependency() + readonly manifest!: Partial; + + @Dependency({ optional: true }) + readonly credentials?: Credentials; + + @Event('error') + readonly $onError!: (event: IErrorEvent) => void; + + @Event('activity') + readonly $onActivity!: (event: IActivityEvent) => Promise; + + get server() { + return this._server; + } + protected _server: http.Server; + + get port() { + return this._port; + } + protected _port?: number | string; + + private adapter: IHttpAdapter; + protected skipAuth: boolean; + protected initialized: boolean = false; + + constructor(adapter: IHttpAdapter, options?: { skipAuth?: boolean }) { + this.adapter = adapter; + this._server = adapter.getServer(); + this.skipAuth = options?.skipAuth ?? false; + } + + /** + * Ensure adapter is initialized (only runs once) + */ + protected async ensureInitialized() { + if (this.initialized) { + return; + } + + // Framework-specific initialization (e.g., Next.js prepare) + if (this.adapter.initialize) { + await this.adapter.initialize(); + } + + // Register Teams bot endpoint + this.adapter.registerRoute({ + method: 'post', + path: '/api/messages', + handler: async (helpers) => { + await this.handleActivity(helpers); + } + }); + + this.initialized = true; + } + + /** + * Initialize the plugin - called by App during initialization + * Sets up routes via the adapter + */ + async onInit() { + await this.ensureInitialized(); + } + + /** + * Start the plugin - called by App.start() + * Delegates to adapter's start method + */ + async onStart({ port }: IPluginStartEvent) { + await this.ensureInitialized(); + + this._port = port; + + // Delegate to adapter's start (may throw if user-provided server) + if (this.adapter.start) { + return await new Promise((resolve, reject) => { + this._server.on('error', (err) => { + this.$onError({ error: err }); + reject(err); + }); + + const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; + this.adapter.start!(portNumber).then(() => { + this.logger.info(`listening on port ${port} 🚀`); + resolve(); + }).catch(reject); + }); + } + } + + /** + * Stop the plugin - called by App.stop() + * Closes the server if we own it + */ + onStop() { + this._server.close(); + } + + /** + * Handle incoming activity + * Validates JWT, processes activity, sends response + */ + protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { + try { + // Extract data from request + const { body, headers } = extractRequestData(); + + // Validate JWT if not skipped + let token: IToken; + if (!this.skipAuth && this.credentials) { + // Validate JWT token + const authHeader = headers['authorization']; + if (!authHeader) { + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + + try { + token = await this.validateJwt(authHeader, body); + } catch (err) { + this.logger.error('JWT validation failed', err); + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + } else { + // Skip auth - create dummy token + token = { + appId: '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } + + // Process activity via App + const response = await this.$onActivity({ + body, + token, + }); + + // Send response + sendResponse({ + status: response.status || 200, + body: response.body + }); + } catch (err) { + this.logger.error('Error processing activity:', err); + sendResponse({ + status: 500, + body: { error: 'Internal server error' } + }); + } + } + + /** + * Validate JWT token + * Uses existing withJwtValidation middleware logic + */ + protected async validateJwt(_authHeader: string, body: any): Promise { + // TODO: Implement proper JWT validation using withJwtValidation middleware + // For now, return a basic token with credentials info + return { + appId: this.credentials?.clientId || '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } +} diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts new file mode 100644 index 000000000..ba606f28a --- /dev/null +++ b/packages/apps/src/plugins/http/express-adapter.ts @@ -0,0 +1,135 @@ +import http from 'http'; +import cors from 'cors'; +import express from 'express'; +import { IHttpAdapter, IRouteConfig } from './adapter'; + +/** + * Express adapter for ConfigurableHttpPlugin + * + * Handles Express-specific HTTP framework concerns: + * - Express app creation and middleware setup + * - Route registration via Express routing + * - Request/response data extraction and sending + * - Server lifecycle management + */ +export class ExpressAdapter implements IHttpAdapter { + protected express: express.Application; + protected server: http.Server; + protected isUserProvidedServer: boolean; + + // Expose Express methods for backwards compatibility + readonly get: express.Application['get']; + readonly post: express.Application['post']; + readonly patch: express.Application['patch']; + readonly put: express.Application['put']; + readonly delete: express.Application['delete']; + readonly route: express.Application['route']; + readonly use: express.Application['use']; + + constructor(server?: http.Server) { + this.isUserProvidedServer = !!server; + this.express = express(); + this.server = server || http.createServer(); + this.server.on('request', this.express); + + // Bind Express methods + this.get = this.express.get.bind(this.express); + this.post = this.express.post.bind(this.express); + this.patch = this.express.patch.bind(this.express); + this.put = this.express.put.bind(this.express); + this.delete = this.express.delete.bind(this.express); + this.route = this.express.route.bind(this.express); + this.use = this.express.use.bind(this.express); + + // Setup middleware + this.express.use(cors()); + this.express.use('/api*', express.json()); + } + + /** + * Get the underlying HTTP server + */ + getServer(): http.Server { + return this.server; + } + + /** + * Register a route with Express + */ + registerRoute(config: IRouteConfig): void { + const { method, path, handler } = config; + + // Convert handler to Express middleware signature + const expressHandler = async ( + req: express.Request, + res: express.Response, + next: express.NextFunction + ) => { + try { + // Provide helpers to the handler + await handler({ + extractRequestData: () => ({ + body: req.body, + headers: req.headers as Record + }), + sendResponse: (response) => { + res.status(response.status).send(response.body); + } + }); + } catch (err) { + next(err); + } + }; + + // Register with Express using the appropriate method + switch (method.toLowerCase()) { + case 'get': + this.express.get(path, expressHandler); + break; + case 'post': + this.express.post(path, expressHandler); + break; + case 'put': + this.express.put(path, expressHandler); + break; + case 'patch': + this.express.patch(path, expressHandler); + break; + case 'delete': + this.express.delete(path, expressHandler); + break; + default: + throw new Error(`Unsupported HTTP method: ${method}`); + } + } + + /** + * Start the server + * Throws if server was user-provided + */ + async start(port: number): Promise { + if (this.isUserProvidedServer) { + throw new Error( + 'Cannot call start() when server was provided by user. ' + + 'User should call server.listen() directly.' + ); + } + + return new Promise((resolve, reject) => { + this.server.listen(port, () => { + resolve(); + }); + this.server.once('error', reject); + }); + } + + /** + * Serve static files + * @param path the url path to serve + * @param dist the dist file path to serve + */ + static(path: string, dist: string): this { + this.express.use(path, express.static(dist)); + return this; + } +} diff --git a/packages/apps/src/plugins/http/index.ts b/packages/apps/src/plugins/http/index.ts index 1110b6451..2731db20d 100644 --- a/packages/apps/src/plugins/http/index.ts +++ b/packages/apps/src/plugins/http/index.ts @@ -1 +1,4 @@ export * from './plugin'; +export * from './configurable-http-plugin'; +export * from './adapter'; +export * from './express-adapter'; From 65d71abb151933568f444b7aced5f491f399039a Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 16 Jan 2026 08:30:55 -0800 Subject: [PATCH 16/33] Fix lint --- .../plugins/http/configurable-http-plugin.ts | 53 ++++++++++--------- .../apps/src/plugins/http/express-adapter.ts | 10 ++-- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/packages/apps/src/plugins/http/configurable-http-plugin.ts b/packages/apps/src/plugins/http/configurable-http-plugin.ts index ede52e804..cf4e62954 100644 --- a/packages/apps/src/plugins/http/configurable-http-plugin.ts +++ b/packages/apps/src/plugins/http/configurable-http-plugin.ts @@ -58,41 +58,17 @@ export class ConfigurableHttpPlugin { } protected _port?: number | string; - private adapter: IHttpAdapter; protected skipAuth: boolean; protected initialized: boolean = false; + private adapter: IHttpAdapter; + constructor(adapter: IHttpAdapter, options?: { skipAuth?: boolean }) { this.adapter = adapter; this._server = adapter.getServer(); this.skipAuth = options?.skipAuth ?? false; } - /** - * Ensure adapter is initialized (only runs once) - */ - protected async ensureInitialized() { - if (this.initialized) { - return; - } - - // Framework-specific initialization (e.g., Next.js prepare) - if (this.adapter.initialize) { - await this.adapter.initialize(); - } - - // Register Teams bot endpoint - this.adapter.registerRoute({ - method: 'post', - path: '/api/messages', - handler: async (helpers) => { - await this.handleActivity(helpers); - } - }); - - this.initialized = true; - } - /** * Initialize the plugin - called by App during initialization * Sets up routes via the adapter @@ -135,6 +111,31 @@ export class ConfigurableHttpPlugin { this._server.close(); } + /** + * Ensure adapter is initialized (only runs once) + */ + protected async ensureInitialized() { + if (this.initialized) { + return; + } + + // Framework-specific initialization (e.g., Next.js prepare) + if (this.adapter.initialize) { + await this.adapter.initialize(); + } + + // Register Teams bot endpoint + this.adapter.registerRoute({ + method: 'post', + path: '/api/messages', + handler: async (helpers) => { + await this.handleActivity(helpers); + } + }); + + this.initialized = true; + } + /** * Handle incoming activity * Validates JWT, processes activity, sends response diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts index ba606f28a..6437909ce 100644 --- a/packages/apps/src/plugins/http/express-adapter.ts +++ b/packages/apps/src/plugins/http/express-adapter.ts @@ -1,6 +1,8 @@ import http from 'http'; + import cors from 'cors'; import express from 'express'; + import { IHttpAdapter, IRouteConfig } from './adapter'; /** @@ -13,10 +15,6 @@ import { IHttpAdapter, IRouteConfig } from './adapter'; * - Server lifecycle management */ export class ExpressAdapter implements IHttpAdapter { - protected express: express.Application; - protected server: http.Server; - protected isUserProvidedServer: boolean; - // Expose Express methods for backwards compatibility readonly get: express.Application['get']; readonly post: express.Application['post']; @@ -26,6 +24,10 @@ export class ExpressAdapter implements IHttpAdapter { readonly route: express.Application['route']; readonly use: express.Application['use']; + protected express: express.Application; + protected server: http.Server; + protected isUserProvidedServer: boolean; + constructor(server?: http.Server) { this.isUserProvidedServer = !!server; this.express = express(); From 8555f2bf9b20ea5bf773d6e4b4518131b129ae05 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Mon, 19 Jan 2026 18:24:06 -0800 Subject: [PATCH 17/33] Remove configurable-http-plugin for HttpServer. --- examples/http-adapters/hono/teams-app.ts | 2 +- packages/apps/src/app.ts | 8 +- packages/apps/src/plugins/http/adapter.ts | 32 +-- .../plugins/http/configurable-http-plugin.ts | 217 ------------------ .../apps/src/plugins/http/express-adapter.ts | 26 +-- packages/apps/src/plugins/http/http-server.ts | 189 +++++++++++++++ packages/apps/src/plugins/http/index.ts | 2 +- packages/botbuilder/src/plugin.ts | 3 + 8 files changed, 229 insertions(+), 250 deletions(-) delete mode 100644 packages/apps/src/plugins/http/configurable-http-plugin.ts create mode 100644 packages/apps/src/plugins/http/http-server.ts diff --git a/examples/http-adapters/hono/teams-app.ts b/examples/http-adapters/hono/teams-app.ts index fea8de1f6..d87237e70 100644 --- a/examples/http-adapters/hono/teams-app.ts +++ b/examples/http-adapters/hono/teams-app.ts @@ -43,7 +43,7 @@ export const app = new App({ httpAdapter: adapter }); -// 4. Handle Teams bot messages +// 5. Handle Teams bot messages app.on('message', async ({ send, activity }) => { await send(`Echo from Hono server: ${activity.text}`); }); diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index 80eeeed52..a6a014fe7 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -41,7 +41,7 @@ import { HttpServer } from './http/http-server'; import * as manifest from './manifest'; import * as middleware from './middleware'; import { DEFAULT_OAUTH_SETTINGS, OAuthSettings } from './oauth'; -import { HttpPlugin } from './plugins'; +import { HttpPlugin, HttpServer, ExpressAdapter } from './plugins'; import { Router } from './router'; import { TokenManager } from './token-manager'; import { IPlugin, AppEvents } from './types'; @@ -396,6 +396,12 @@ export class App { * initialize the app. */ async initialize() { + // initialize server (register routes) + await this.server.initialize({ + logger: this.log, + credentials: this.credentials, + }); + // initialize plugins for (const plugin of this.plugins) { this.inject(plugin); diff --git a/packages/apps/src/plugins/http/adapter.ts b/packages/apps/src/plugins/http/adapter.ts index 5c4e66bb2..86ac6f64a 100644 --- a/packages/apps/src/plugins/http/adapter.ts +++ b/packages/apps/src/plugins/http/adapter.ts @@ -1,5 +1,3 @@ -import http from 'http'; - /** * Helpers provided to route handlers */ @@ -30,16 +28,10 @@ export interface IRouteConfig { /** * Adapter interface for different HTTP frameworks * - * Adapters handle framework-specific HTTP concerns while ConfigurableHttpPlugin + * Adapters handle framework-specific HTTP concerns while HttpServer * handles Teams protocol logic (JWT validation, activity processing, etc.) */ export interface IHttpAdapter { - /** - * Get the underlying HTTP server - * The adapter owns the server (creates it or accepts it from user) - */ - getServer(): http.Server; - /** * Register a route with the adapter * The adapter handles framework-specific routing logic and provides helpers to the handler @@ -48,16 +40,24 @@ export interface IHttpAdapter { registerRoute(config: IRouteConfig): void; /** - * Optional: Framework-specific initialization - * Called during ConfigurableHttpPlugin.initialize() + * Serve static files from a directory + * @param path URL path prefix (e.g., '/static') + * @param directory File system directory to serve from + */ + serveStatic(path: string, directory: string): void; + + /** + * Framework-specific initialization + * Called during HttpServer.ensureInitialized() * Example: Next.js needs nextApp.prepare() + * Throw if not needed */ - initialize?(): Promise; + initialize(): Promise; /** - * Optional: Start the server - * Called during ConfigurableHttpPlugin.start() - * Should throw error if server is user-provided + * Start the server + * Called during HttpServer.start() + * Throw if server is user-provided and cannot be started */ - start?(port: number): Promise; + start(port: number): Promise; } diff --git a/packages/apps/src/plugins/http/configurable-http-plugin.ts b/packages/apps/src/plugins/http/configurable-http-plugin.ts deleted file mode 100644 index cf4e62954..000000000 --- a/packages/apps/src/plugins/http/configurable-http-plugin.ts +++ /dev/null @@ -1,217 +0,0 @@ -import http from 'http'; - -import { - Credentials, - InvokeResponse, - IToken -} from '@microsoft/teams.api'; - -import { ILogger } from '@microsoft/teams.common'; - -import pkg from '../../../package.json'; -import { IActivityEvent, IErrorEvent } from '../../events'; -import { Manifest } from '../../manifest'; -import { - Dependency, - Event, - IPluginStartEvent, - Logger, - Plugin, -} from '../../types'; - -import { IHttpAdapter, IRequestHelpers } from './adapter'; - -/** - * Configurable HTTP plugin that works with different HTTP frameworks via adapters - * - * This plugin handles Teams protocol logic (JWT validation, activity processing) - * while delegating HTTP framework concerns to the adapter. - */ -@Plugin({ - name: 'http', - version: pkg.version, - description: 'Configurable HTTP plugin that works with different frameworks via adapters', -}) -export class ConfigurableHttpPlugin { - @Logger() - readonly logger!: ILogger; - - @Dependency() - readonly manifest!: Partial; - - @Dependency({ optional: true }) - readonly credentials?: Credentials; - - @Event('error') - readonly $onError!: (event: IErrorEvent) => void; - - @Event('activity') - readonly $onActivity!: (event: IActivityEvent) => Promise; - - get server() { - return this._server; - } - protected _server: http.Server; - - get port() { - return this._port; - } - protected _port?: number | string; - - protected skipAuth: boolean; - protected initialized: boolean = false; - - private adapter: IHttpAdapter; - - constructor(adapter: IHttpAdapter, options?: { skipAuth?: boolean }) { - this.adapter = adapter; - this._server = adapter.getServer(); - this.skipAuth = options?.skipAuth ?? false; - } - - /** - * Initialize the plugin - called by App during initialization - * Sets up routes via the adapter - */ - async onInit() { - await this.ensureInitialized(); - } - - /** - * Start the plugin - called by App.start() - * Delegates to adapter's start method - */ - async onStart({ port }: IPluginStartEvent) { - await this.ensureInitialized(); - - this._port = port; - - // Delegate to adapter's start (may throw if user-provided server) - if (this.adapter.start) { - return await new Promise((resolve, reject) => { - this._server.on('error', (err) => { - this.$onError({ error: err }); - reject(err); - }); - - const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; - this.adapter.start!(portNumber).then(() => { - this.logger.info(`listening on port ${port} 🚀`); - resolve(); - }).catch(reject); - }); - } - } - - /** - * Stop the plugin - called by App.stop() - * Closes the server if we own it - */ - onStop() { - this._server.close(); - } - - /** - * Ensure adapter is initialized (only runs once) - */ - protected async ensureInitialized() { - if (this.initialized) { - return; - } - - // Framework-specific initialization (e.g., Next.js prepare) - if (this.adapter.initialize) { - await this.adapter.initialize(); - } - - // Register Teams bot endpoint - this.adapter.registerRoute({ - method: 'post', - path: '/api/messages', - handler: async (helpers) => { - await this.handleActivity(helpers); - } - }); - - this.initialized = true; - } - - /** - * Handle incoming activity - * Validates JWT, processes activity, sends response - */ - protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { - try { - // Extract data from request - const { body, headers } = extractRequestData(); - - // Validate JWT if not skipped - let token: IToken; - if (!this.skipAuth && this.credentials) { - // Validate JWT token - const authHeader = headers['authorization']; - if (!authHeader) { - sendResponse({ - status: 401, - body: { error: 'Unauthorized' } - }); - return; - } - - try { - token = await this.validateJwt(authHeader, body); - } catch (err) { - this.logger.error('JWT validation failed', err); - sendResponse({ - status: 401, - body: { error: 'Unauthorized' } - }); - return; - } - } else { - // Skip auth - create dummy token - token = { - appId: '', - from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, - }; - } - - // Process activity via App - const response = await this.$onActivity({ - body, - token, - }); - - // Send response - sendResponse({ - status: response.status || 200, - body: response.body - }); - } catch (err) { - this.logger.error('Error processing activity:', err); - sendResponse({ - status: 500, - body: { error: 'Internal server error' } - }); - } - } - - /** - * Validate JWT token - * Uses existing withJwtValidation middleware logic - */ - protected async validateJwt(_authHeader: string, body: any): Promise { - // TODO: Implement proper JWT validation using withJwtValidation middleware - // For now, return a basic token with credentials info - return { - appId: this.credentials?.clientId || '', - from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, - }; - } -} diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts index 6437909ce..07f85613e 100644 --- a/packages/apps/src/plugins/http/express-adapter.ts +++ b/packages/apps/src/plugins/http/express-adapter.ts @@ -6,7 +6,7 @@ import express from 'express'; import { IHttpAdapter, IRouteConfig } from './adapter'; /** - * Express adapter for ConfigurableHttpPlugin + * Express adapter for HttpServer * * Handles Express-specific HTTP framework concerns: * - Express app creation and middleware setup @@ -48,13 +48,6 @@ export class ExpressAdapter implements IHttpAdapter { this.express.use('/api*', express.json()); } - /** - * Get the underlying HTTP server - */ - getServer(): http.Server { - return this.server; - } - /** * Register a route with Express */ @@ -105,6 +98,14 @@ export class ExpressAdapter implements IHttpAdapter { } } + /** + * Initialize the adapter + * No-op for Express + */ + async initialize(): Promise { + // No initialization needed for Express + } + /** * Start the server * Throws if server was user-provided @@ -126,12 +127,9 @@ export class ExpressAdapter implements IHttpAdapter { } /** - * Serve static files - * @param path the url path to serve - * @param dist the dist file path to serve + * Serve static files from a directory */ - static(path: string, dist: string): this { - this.express.use(path, express.static(dist)); - return this; + serveStatic(path: string, directory: string): void { + this.express.use(path, express.static(directory)); } } diff --git a/packages/apps/src/plugins/http/http-server.ts b/packages/apps/src/plugins/http/http-server.ts new file mode 100644 index 000000000..eb1907d1c --- /dev/null +++ b/packages/apps/src/plugins/http/http-server.ts @@ -0,0 +1,189 @@ +import { + Credentials, + InvokeResponse, + IToken +} from '@microsoft/teams.api'; + +import { ILogger } from '@microsoft/teams.common'; + +import { IActivityEvent } from '../../events'; + +import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; + +export type HttpServerOptions = { + readonly skipAuth?: boolean; +}; + +/** + * Configurable HTTP server for receiving Teams activities + */ +export class HttpServer { + /** + * Callback invoked when a valid activity request arrives + * App should set this to process activities + */ + onRequest?: (event: IActivityEvent) => Promise; + + protected logger!: ILogger; + protected credentials?: Credentials; + protected skipAuth: boolean; + protected initialized: boolean = false; + + private _adapter: IHttpAdapter; + + /** + * Get the underlying adapter + * Useful for plugins that need adapter-specific features + */ + get adapter(): IHttpAdapter { + return this._adapter; + } + + constructor(adapter: IHttpAdapter, options?: HttpServerOptions) { + this._adapter = adapter; + this.skipAuth = options?.skipAuth ?? false; + } + + /** + * Initialize the server with dependencies (registers routes, prepares adapter) + * Can be called multiple times - only initializes once + * Called by App.initialize() + */ + async initialize(deps: { + logger: ILogger; + credentials?: Credentials; + }) { + if (this.initialized) { + this.logger?.debug('HttpServer already initialized, skipping'); + return; + } + + this.logger = deps.logger; + this.credentials = deps.credentials; + + // Framework-specific initialization (e.g., Next.js prepare) + await this._adapter.initialize(); + + // Register Teams bot endpoint + this._adapter.registerRoute({ + method: 'post', + path: '/api/messages', + handler: async (helpers) => { + await this.handleActivity(helpers); + } + }); + + this.initialized = true; + } + + /** + * Start the HTTP server + * Called by App.start() + */ + async start(port: number | string) { + const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; + await this._adapter.start(portNumber); + this.logger.info(`listening on port ${port} 🚀`); + } + + /** + * Register a route with the adapter + * Used by app.function() and other app methods + */ + registerRoute(config: IRouteConfig) { + this._adapter.registerRoute(config); + } + + /** + * Serve static files from a directory + * Used by app.tab() and other app methods + */ + serveStatic(path: string, directory: string) { + this._adapter.serveStatic(path, directory); + } + + + /** + * Handle incoming activity + * Validates JWT, signals app, sends response + */ + protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { + try { + // Extract data from request + const { body, headers } = extractRequestData(); + this.logger.debug('Handling activity', body); + + // Validate JWT if not skipped + let token: IToken; + if (!this.skipAuth && this.credentials) { + // Validate JWT token + const authHeader = headers['authorization']; + if (!authHeader) { + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + + try { + token = await this.validateJwt(authHeader, body); + } catch (err) { + this.logger.error('JWT validation failed', err); + sendResponse({ + status: 401, + body: { error: 'Unauthorized' } + }); + return; + } + } else { + // Skip auth - create dummy token + token = { + appId: '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } + + // Signal app to process activity + if (!this.onRequest) { + throw new Error('HttpServer.onRequest callback not set'); + } + + const response = await this.onRequest({ + body, + token, + }); + + // Send response + sendResponse({ + status: response.status || 200, + body: response.body + }); + } catch (err) { + this.logger.error('Error processing activity:', err); + sendResponse({ + status: 500, + body: { error: 'Internal server error' } + }); + } + } + + /** + * Validate JWT token + * Uses existing withJwtValidation middleware logic + */ + protected async validateJwt(_authHeader: string, body: any): Promise { + // TODO: Implement proper JWT validation using withJwtValidation middleware + // For now, return a basic token with credentials info + return { + appId: this.credentials?.clientId || '', + from: 'azure', + fromId: '', + serviceUrl: body.serviceUrl || '', + isExpired: () => false, + }; + } +} diff --git a/packages/apps/src/plugins/http/index.ts b/packages/apps/src/plugins/http/index.ts index 2731db20d..2517e18b5 100644 --- a/packages/apps/src/plugins/http/index.ts +++ b/packages/apps/src/plugins/http/index.ts @@ -1,4 +1,4 @@ export * from './plugin'; -export * from './configurable-http-plugin'; +export * from './http-server'; export * from './adapter'; export * from './express-adapter'; diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index b28c9f8dc..8b084b152 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -46,6 +46,9 @@ export class BotBuilderPlugin implements IPlugin { @HttpServer() declare readonly httpServer: IHttpServer; + @Dependency() + declare readonly httpServer: HttpServer; + @Dependency() declare readonly manifest: Partial; From 638f876c0d938b90bf53d907c7f8e2b12e829762 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Tue, 20 Jan 2026 10:48:00 -0800 Subject: [PATCH 18/33] Use Adapter --- examples/http-adapters/hono/teams-app.ts | 2 +- packages/apps/src/app.ts | 2 +- packages/apps/src/plugins/http/adapter.ts | 63 ------ .../apps/src/plugins/http/express-adapter.ts | 135 ------------- packages/apps/src/plugins/http/http-server.ts | 189 ------------------ packages/apps/src/plugins/http/index.ts | 3 - packages/botbuilder/src/plugin.ts | 2 +- 7 files changed, 3 insertions(+), 393 deletions(-) delete mode 100644 packages/apps/src/plugins/http/adapter.ts delete mode 100644 packages/apps/src/plugins/http/express-adapter.ts delete mode 100644 packages/apps/src/plugins/http/http-server.ts diff --git a/examples/http-adapters/hono/teams-app.ts b/examples/http-adapters/hono/teams-app.ts index d87237e70..fea8de1f6 100644 --- a/examples/http-adapters/hono/teams-app.ts +++ b/examples/http-adapters/hono/teams-app.ts @@ -43,7 +43,7 @@ export const app = new App({ httpAdapter: adapter }); -// 5. Handle Teams bot messages +// 4. Handle Teams bot messages app.on('message', async ({ send, activity }) => { await send(`Echo from Hono server: ${activity.text}`); }); diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index a6a014fe7..814af7f06 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -41,7 +41,7 @@ import { HttpServer } from './http/http-server'; import * as manifest from './manifest'; import * as middleware from './middleware'; import { DEFAULT_OAUTH_SETTINGS, OAuthSettings } from './oauth'; -import { HttpPlugin, HttpServer, ExpressAdapter } from './plugins'; +import { HttpPlugin } from './plugins'; import { Router } from './router'; import { TokenManager } from './token-manager'; import { IPlugin, AppEvents } from './types'; diff --git a/packages/apps/src/plugins/http/adapter.ts b/packages/apps/src/plugins/http/adapter.ts deleted file mode 100644 index 86ac6f64a..000000000 --- a/packages/apps/src/plugins/http/adapter.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Helpers provided to route handlers - */ -export interface IRequestHelpers { - /** - * Extract standardized request data from the framework request - */ - extractRequestData: () => { - body: any; - headers: Record; - }; - - /** - * Send standardized response using the framework response - */ - sendResponse: (response: { status: number; body: any }) => void; -} - -/** - * Configuration for registering a route with the adapter - */ -export interface IRouteConfig { - method: string; - path: string; - handler: (helpers: IRequestHelpers) => Promise; -} - -/** - * Adapter interface for different HTTP frameworks - * - * Adapters handle framework-specific HTTP concerns while HttpServer - * handles Teams protocol logic (JWT validation, activity processing, etc.) - */ -export interface IHttpAdapter { - /** - * Register a route with the adapter - * The adapter handles framework-specific routing logic and provides helpers to the handler - * @param config Route configuration with method, path, and handler - */ - registerRoute(config: IRouteConfig): void; - - /** - * Serve static files from a directory - * @param path URL path prefix (e.g., '/static') - * @param directory File system directory to serve from - */ - serveStatic(path: string, directory: string): void; - - /** - * Framework-specific initialization - * Called during HttpServer.ensureInitialized() - * Example: Next.js needs nextApp.prepare() - * Throw if not needed - */ - initialize(): Promise; - - /** - * Start the server - * Called during HttpServer.start() - * Throw if server is user-provided and cannot be started - */ - start(port: number): Promise; -} diff --git a/packages/apps/src/plugins/http/express-adapter.ts b/packages/apps/src/plugins/http/express-adapter.ts deleted file mode 100644 index 07f85613e..000000000 --- a/packages/apps/src/plugins/http/express-adapter.ts +++ /dev/null @@ -1,135 +0,0 @@ -import http from 'http'; - -import cors from 'cors'; -import express from 'express'; - -import { IHttpAdapter, IRouteConfig } from './adapter'; - -/** - * Express adapter for HttpServer - * - * Handles Express-specific HTTP framework concerns: - * - Express app creation and middleware setup - * - Route registration via Express routing - * - Request/response data extraction and sending - * - Server lifecycle management - */ -export class ExpressAdapter implements IHttpAdapter { - // Expose Express methods for backwards compatibility - readonly get: express.Application['get']; - readonly post: express.Application['post']; - readonly patch: express.Application['patch']; - readonly put: express.Application['put']; - readonly delete: express.Application['delete']; - readonly route: express.Application['route']; - readonly use: express.Application['use']; - - protected express: express.Application; - protected server: http.Server; - protected isUserProvidedServer: boolean; - - constructor(server?: http.Server) { - this.isUserProvidedServer = !!server; - this.express = express(); - this.server = server || http.createServer(); - this.server.on('request', this.express); - - // Bind Express methods - this.get = this.express.get.bind(this.express); - this.post = this.express.post.bind(this.express); - this.patch = this.express.patch.bind(this.express); - this.put = this.express.put.bind(this.express); - this.delete = this.express.delete.bind(this.express); - this.route = this.express.route.bind(this.express); - this.use = this.express.use.bind(this.express); - - // Setup middleware - this.express.use(cors()); - this.express.use('/api*', express.json()); - } - - /** - * Register a route with Express - */ - registerRoute(config: IRouteConfig): void { - const { method, path, handler } = config; - - // Convert handler to Express middleware signature - const expressHandler = async ( - req: express.Request, - res: express.Response, - next: express.NextFunction - ) => { - try { - // Provide helpers to the handler - await handler({ - extractRequestData: () => ({ - body: req.body, - headers: req.headers as Record - }), - sendResponse: (response) => { - res.status(response.status).send(response.body); - } - }); - } catch (err) { - next(err); - } - }; - - // Register with Express using the appropriate method - switch (method.toLowerCase()) { - case 'get': - this.express.get(path, expressHandler); - break; - case 'post': - this.express.post(path, expressHandler); - break; - case 'put': - this.express.put(path, expressHandler); - break; - case 'patch': - this.express.patch(path, expressHandler); - break; - case 'delete': - this.express.delete(path, expressHandler); - break; - default: - throw new Error(`Unsupported HTTP method: ${method}`); - } - } - - /** - * Initialize the adapter - * No-op for Express - */ - async initialize(): Promise { - // No initialization needed for Express - } - - /** - * Start the server - * Throws if server was user-provided - */ - async start(port: number): Promise { - if (this.isUserProvidedServer) { - throw new Error( - 'Cannot call start() when server was provided by user. ' + - 'User should call server.listen() directly.' - ); - } - - return new Promise((resolve, reject) => { - this.server.listen(port, () => { - resolve(); - }); - this.server.once('error', reject); - }); - } - - /** - * Serve static files from a directory - */ - serveStatic(path: string, directory: string): void { - this.express.use(path, express.static(directory)); - } -} diff --git a/packages/apps/src/plugins/http/http-server.ts b/packages/apps/src/plugins/http/http-server.ts deleted file mode 100644 index eb1907d1c..000000000 --- a/packages/apps/src/plugins/http/http-server.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { - Credentials, - InvokeResponse, - IToken -} from '@microsoft/teams.api'; - -import { ILogger } from '@microsoft/teams.common'; - -import { IActivityEvent } from '../../events'; - -import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; - -export type HttpServerOptions = { - readonly skipAuth?: boolean; -}; - -/** - * Configurable HTTP server for receiving Teams activities - */ -export class HttpServer { - /** - * Callback invoked when a valid activity request arrives - * App should set this to process activities - */ - onRequest?: (event: IActivityEvent) => Promise; - - protected logger!: ILogger; - protected credentials?: Credentials; - protected skipAuth: boolean; - protected initialized: boolean = false; - - private _adapter: IHttpAdapter; - - /** - * Get the underlying adapter - * Useful for plugins that need adapter-specific features - */ - get adapter(): IHttpAdapter { - return this._adapter; - } - - constructor(adapter: IHttpAdapter, options?: HttpServerOptions) { - this._adapter = adapter; - this.skipAuth = options?.skipAuth ?? false; - } - - /** - * Initialize the server with dependencies (registers routes, prepares adapter) - * Can be called multiple times - only initializes once - * Called by App.initialize() - */ - async initialize(deps: { - logger: ILogger; - credentials?: Credentials; - }) { - if (this.initialized) { - this.logger?.debug('HttpServer already initialized, skipping'); - return; - } - - this.logger = deps.logger; - this.credentials = deps.credentials; - - // Framework-specific initialization (e.g., Next.js prepare) - await this._adapter.initialize(); - - // Register Teams bot endpoint - this._adapter.registerRoute({ - method: 'post', - path: '/api/messages', - handler: async (helpers) => { - await this.handleActivity(helpers); - } - }); - - this.initialized = true; - } - - /** - * Start the HTTP server - * Called by App.start() - */ - async start(port: number | string) { - const portNumber = typeof port === 'string' ? parseInt(port, 10) : port; - await this._adapter.start(portNumber); - this.logger.info(`listening on port ${port} 🚀`); - } - - /** - * Register a route with the adapter - * Used by app.function() and other app methods - */ - registerRoute(config: IRouteConfig) { - this._adapter.registerRoute(config); - } - - /** - * Serve static files from a directory - * Used by app.tab() and other app methods - */ - serveStatic(path: string, directory: string) { - this._adapter.serveStatic(path, directory); - } - - - /** - * Handle incoming activity - * Validates JWT, signals app, sends response - */ - protected async handleActivity({ extractRequestData, sendResponse }: IRequestHelpers) { - try { - // Extract data from request - const { body, headers } = extractRequestData(); - this.logger.debug('Handling activity', body); - - // Validate JWT if not skipped - let token: IToken; - if (!this.skipAuth && this.credentials) { - // Validate JWT token - const authHeader = headers['authorization']; - if (!authHeader) { - sendResponse({ - status: 401, - body: { error: 'Unauthorized' } - }); - return; - } - - try { - token = await this.validateJwt(authHeader, body); - } catch (err) { - this.logger.error('JWT validation failed', err); - sendResponse({ - status: 401, - body: { error: 'Unauthorized' } - }); - return; - } - } else { - // Skip auth - create dummy token - token = { - appId: '', - from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, - }; - } - - // Signal app to process activity - if (!this.onRequest) { - throw new Error('HttpServer.onRequest callback not set'); - } - - const response = await this.onRequest({ - body, - token, - }); - - // Send response - sendResponse({ - status: response.status || 200, - body: response.body - }); - } catch (err) { - this.logger.error('Error processing activity:', err); - sendResponse({ - status: 500, - body: { error: 'Internal server error' } - }); - } - } - - /** - * Validate JWT token - * Uses existing withJwtValidation middleware logic - */ - protected async validateJwt(_authHeader: string, body: any): Promise { - // TODO: Implement proper JWT validation using withJwtValidation middleware - // For now, return a basic token with credentials info - return { - appId: this.credentials?.clientId || '', - from: 'azure', - fromId: '', - serviceUrl: body.serviceUrl || '', - isExpired: () => false, - }; - } -} diff --git a/packages/apps/src/plugins/http/index.ts b/packages/apps/src/plugins/http/index.ts index 2517e18b5..1110b6451 100644 --- a/packages/apps/src/plugins/http/index.ts +++ b/packages/apps/src/plugins/http/index.ts @@ -1,4 +1 @@ export * from './plugin'; -export * from './http-server'; -export * from './adapter'; -export * from './express-adapter'; diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index 8b084b152..02c665f69 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -47,7 +47,7 @@ export class BotBuilderPlugin implements IPlugin { declare readonly httpServer: IHttpServer; @Dependency() - declare readonly httpServer: HttpServer; + declare readonly httpServer: IHttpServer; @Dependency() declare readonly manifest: Partial; From 3d2ec4619643f62e68c86c57ef1c3f7f3c406f75 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Tue, 20 Jan 2026 14:55:20 -0800 Subject: [PATCH 19/33] HttpServer --- packages/apps/src/app.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index 814af7f06..80eeeed52 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -396,12 +396,6 @@ export class App { * initialize the app. */ async initialize() { - // initialize server (register routes) - await this.server.initialize({ - logger: this.log, - credentials: this.credentials, - }); - // initialize plugins for (const plugin of this.plugins) { this.inject(plugin); From 38c274f138f077bc13273bc1b30a46f12ce27c75 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 23 Jan 2026 15:57:18 -0800 Subject: [PATCH 20/33] Remove paths --- examples/http-adapters/README.md | 8 ++- examples/http-adapters/hono/hono-adapter.ts | 35 +++--------- examples/http-adapters/hono/index.ts | 56 +++++++++++++++++-- examples/http-adapters/hono/teams-app.ts | 49 ---------------- .../http-adapters/nextjs/nextjs-adapter.ts | 5 +- packages/apps/src/app.embed.ts | 15 ----- packages/apps/src/http/adapter.ts | 7 ++- packages/apps/src/http/express-adapter.ts | 27 ++------- packages/apps/src/http/http-server.ts | 3 +- packages/apps/src/plugins/http/plugin.spec.ts | 1 - 10 files changed, 78 insertions(+), 128 deletions(-) delete mode 100644 examples/http-adapters/hono/teams-app.ts diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md index cdd698d73..27887b5f0 100644 --- a/examples/http-adapters/README.md +++ b/examples/http-adapters/README.md @@ -168,7 +168,8 @@ All adapters implement the `IHttpAdapter` interface: ```typescript interface IHttpAdapter { /** - * Register a route handler + * Register a POST route handler + * All routes are POST-only (Teams bot protocol uses POST) */ registerRouteHandler(config: IRouteConfig): void; @@ -195,6 +196,11 @@ interface IHttpAdapter { */ stop?(): Promise; } + +interface IRouteConfig { + path: string; + handler: (helpers: IRequestHelpers) => Promise; +} ``` ## Usage Pattern diff --git a/examples/http-adapters/hono/hono-adapter.ts b/examples/http-adapters/hono/hono-adapter.ts index 649be984d..6688d52ee 100644 --- a/examples/http-adapters/hono/hono-adapter.ts +++ b/examples/http-adapters/hono/hono-adapter.ts @@ -25,20 +25,17 @@ export class HonoAdapter implements IHttpAdapter { } /** - * Register a route handler with Hono + * Register a POST route handler with Hono + * All routes are POST-only (Teams bot protocol uses POST) */ registerRouteHandler(config: IRouteConfig): void { - const { method, path, handler } = config; + const { path, handler } = config; // Convert handler to Hono handler signature const honoHandler = async (c: Context) => { try { - // Parse body the Hono way - let body: any = {}; - if (c.req.method !== 'GET' && c.req.method !== 'HEAD') { - body = await c.req.json().catch(() => ({})); - } - + // Parse JSON body + const body = await c.req.json().catch(() => ({})); const headers = Object.fromEntries(c.req.raw.headers.entries()); let responseData: { status: number; body: any } | undefined; @@ -66,26 +63,8 @@ export class HonoAdapter implements IHttpAdapter { } }; - // Register with Hono using the appropriate method - switch (method.toLowerCase()) { - case 'get': - this.hono.get(path, honoHandler); - break; - case 'post': - this.hono.post(path, honoHandler); - break; - case 'put': - this.hono.put(path, honoHandler); - break; - case 'patch': - this.hono.patch(path, honoHandler); - break; - case 'delete': - this.hono.delete(path, honoHandler); - break; - default: - throw new Error(`Unsupported HTTP method: ${method}`); - } + // Register as POST route + this.hono.post(path, honoHandler); } /** diff --git a/examples/http-adapters/hono/index.ts b/examples/http-adapters/hono/index.ts index a461e33e3..4aa846051 100644 --- a/examples/http-adapters/hono/index.ts +++ b/examples/http-adapters/hono/index.ts @@ -1,18 +1,64 @@ import 'dotenv/config'; import { serve } from '@hono/node-server'; -import { app, hono } from './teams-app'; +import { Hono } from 'hono'; +import { App } from '@microsoft/teams.apps'; +import { HonoAdapter } from './hono-adapter'; const port = parseInt(process.env.PORT || '3978', 10); async function main() { console.log('Starting Hono server with Teams bot integration...\n'); - // Initialize teams.ts app - this adds /api/messages to your Hono app - await app.initialize(); + // 1. Create your Hono app with your own routes + const hono = new Hono(); + + // Add your custom routes + hono.get('/health', (c) => { + return c.json({ status: 'healthy', timestamp: new Date().toISOString() }); + }); + + hono.get('/api/users', (c) => { + return c.json({ + users: [ + { id: 1, name: 'Alice' }, + { id: 2, name: 'Bob' } + ] + }); + }); + + hono.get('/', (c) => { + return c.html(` + + +

Hono + teams.ts

+

Your Hono server is running with a Teams bot!

+ + + + `); + }); - // If you wanted the App class to handle server lifecycle, your adapter would need to implement start / stop - // app.start().catch(console.error) + // 2. Create Hono adapter with your Hono app + const adapter = new HonoAdapter(hono); + + // 3. Create teams.ts app with the adapter + const app = new App({ + httpAdapter: adapter + }); + + // 4. Handle Teams bot messages + app.on('message', async ({ send, activity }) => { + await send(`Echo from Hono server: ${activity.text}`); + }); + + // 5. Initialize teams.ts app - this adds /api/messages to your Hono app + await app.initialize(); + // 6. Start your Hono server directly (adapter doesn't manage lifecycle) serve({ fetch: hono.fetch, port diff --git a/examples/http-adapters/hono/teams-app.ts b/examples/http-adapters/hono/teams-app.ts deleted file mode 100644 index fea8de1f6..000000000 --- a/examples/http-adapters/hono/teams-app.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Hono } from 'hono'; -import { App } from '@microsoft/teams.apps'; -import { HonoAdapter } from './hono-adapter'; - -// 1. Create your Hono app with your own routes -export const hono = new Hono(); - -// Add your custom routes -hono.get('/health', (c) => { - return c.json({ status: 'healthy', timestamp: new Date().toISOString() }); -}); - -hono.get('/api/users', (c) => { - return c.json({ - users: [ - { id: 1, name: 'Alice' }, - { id: 2, name: 'Bob' } - ] - }); -}); - -hono.get('/', (c) => { - return c.html(` - - -

Hono + teams.ts

-

Your Hono server is running with a Teams bot!

- - - - `); -}); - -// 2. Create Hono adapter with your Hono app -export const adapter = new HonoAdapter(hono); - -// 3. Create teams.ts app with the adapter -export const app = new App({ - httpAdapter: adapter -}); - -// 4. Handle Teams bot messages -app.on('message', async ({ send, activity }) => { - await send(`Echo from Hono server: ${activity.text}`); -}); diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts index 5b83476d0..ac7aac47d 100644 --- a/examples/http-adapters/nextjs/nextjs-adapter.ts +++ b/examples/http-adapters/nextjs/nextjs-adapter.ts @@ -32,11 +32,12 @@ export class NextjsAdapter implements IHttpAdapter { } /** - * Register a route handler with the adapter + * Register a POST route handler with the adapter * Routes are stored and handled before Next.js gets the request + * All routes are POST-only (Teams bot protocol uses POST) */ registerRouteHandler(config: IRouteConfig): void { - const key = `${config.method.toUpperCase()}:${config.path}`; + const key = `POST:${config.path}`; this.routes.set(key, config); } diff --git a/packages/apps/src/app.embed.ts b/packages/apps/src/app.embed.ts index 5772b4def..5fd1882db 100644 --- a/packages/apps/src/app.embed.ts +++ b/packages/apps/src/app.embed.ts @@ -1,6 +1,3 @@ -import fs from 'fs'; -import npath from 'path'; - import { ActivityLike } from '@microsoft/teams.api'; import { App } from './app'; @@ -23,7 +20,6 @@ export function func( const entraTokenValidator = this.entraTokenValidator; this.server.registerRouteHandler({ - method: 'post', path: `/api/functions/${name}`, handler: async (helpers) => { const { body, headers } = helpers.extractRequestData(); @@ -134,17 +130,6 @@ export function tab( this.server.serveStatic(`/tabs/${name}`, path); - // SPA fallback - serve index.html for sub-routes - const indexPath = npath.join(path, 'index.html'); - this.server.registerRouteHandler({ - method: 'get', - path: `/tabs/${name}/*`, - handler: async (helpers) => { - const html = fs.readFileSync(indexPath, 'utf-8'); - helpers.sendResponse({ status: 200, body: html }); - } - }); - return this; } diff --git a/packages/apps/src/http/adapter.ts b/packages/apps/src/http/adapter.ts index c6969b284..774ebcd80 100644 --- a/packages/apps/src/http/adapter.ts +++ b/packages/apps/src/http/adapter.ts @@ -18,9 +18,9 @@ export interface IRequestHelpers { /** * Configuration for registering a route with the adapter + * All routes are POST only (Teams bot protocol uses POST) */ export interface IRouteConfig { - method: string; path: string; handler: (helpers: IRequestHelpers) => Promise; } @@ -33,9 +33,10 @@ export interface IRouteConfig { */ export interface IHttpAdapter { /** - * Register a route with the adapter + * Register a POST route with the adapter + * All routes are POST-only (Teams bot protocol uses POST) * The adapter handles framework-specific routing logic and provides helpers to the handler - * @param config Route configuration with method, path, and handler + * @param config Route configuration with path and handler */ registerRouteHandler(config: IRouteConfig): void; diff --git a/packages/apps/src/http/express-adapter.ts b/packages/apps/src/http/express-adapter.ts index ebdaf2808..2ef47d6d8 100644 --- a/packages/apps/src/http/express-adapter.ts +++ b/packages/apps/src/http/express-adapter.ts @@ -47,10 +47,11 @@ export class ExpressAdapter implements IHttpAdapter { } /** - * Register a route handler with Express + * Register a POST route handler with Express + * All routes are POST-only (Teams bot protocol uses POST) */ registerRouteHandler(config: IRouteConfig): void { - const { method, path, handler } = config; + const { path, handler } = config; // Convert handler to Express middleware signature const expressHandler = async ( @@ -74,26 +75,8 @@ export class ExpressAdapter implements IHttpAdapter { } }; - // Register with Express using the appropriate method - switch (method.toLowerCase()) { - case 'get': - this.express.get(path, expressHandler); - break; - case 'post': - this.express.post(path, expressHandler); - break; - case 'put': - this.express.put(path, expressHandler); - break; - case 'patch': - this.express.patch(path, expressHandler); - break; - case 'delete': - this.express.delete(path, expressHandler); - break; - default: - throw new Error(`Unsupported HTTP method: ${method}`); - } + // Register as POST route + this.express.post(path, expressHandler); } /** diff --git a/packages/apps/src/http/http-server.ts b/packages/apps/src/http/http-server.ts index 87a3daa17..249b24d91 100644 --- a/packages/apps/src/http/http-server.ts +++ b/packages/apps/src/http/http-server.ts @@ -101,9 +101,8 @@ export class HttpServer implements IHttpServer { await this._adapter.initialize(); } - // Register Teams bot endpoint + // Register Teams bot endpoint (POST only) this._adapter.registerRouteHandler({ - method: 'post', path: '/api/messages', handler: async (helpers) => { await this.handleActivity(helpers); diff --git a/packages/apps/src/plugins/http/plugin.spec.ts b/packages/apps/src/plugins/http/plugin.spec.ts index 9b5c81cfe..2a9b9e8d6 100644 --- a/packages/apps/src/plugins/http/plugin.spec.ts +++ b/packages/apps/src/plugins/http/plugin.spec.ts @@ -157,7 +157,6 @@ describe('HttpPlugin', () => { // App should still be able to register routes const mockHandler = jest.fn(); app.server.registerRouteHandler({ - method: 'get', path: '/test', handler: mockHandler, }); From 9ada3a070c65afd29442b651cd2d8450d888b343 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 23 Jan 2026 16:31:21 -0800 Subject: [PATCH 21/33] Fix examples --- examples/http-adapters/express/README.md | 122 ++++----------- examples/http-adapters/express/teams-app.ts | 6 +- examples/http-adapters/hono/README.md | 146 +++--------------- .../http-adapters/nextjs/nextjs-adapter.ts | 43 ++---- examples/http-adapters/nextjs/server.ts | 18 +-- examples/http-adapters/nextjs/teams-app.ts | 18 +-- 6 files changed, 79 insertions(+), 274 deletions(-) diff --git a/examples/http-adapters/express/README.md b/examples/http-adapters/express/README.md index 321f6972d..917e1d10f 100644 --- a/examples/http-adapters/express/README.md +++ b/examples/http-adapters/express/README.md @@ -1,118 +1,50 @@ -# Express + teams.ts Example (Adapter Pattern) +# Express + teams.ts Example -This example demonstrates how to use **Express** with teams.ts using the explicit `ExpressAdapter` and `ConfigurableHttpPlugin`. +This example shows how to integrate teams.ts into your **existing Express server**. -## Why This Example? +## Key Concept -While teams.ts provides `HttpPlugin` (which uses Express internally), this example shows: -1. The **explicit adapter pattern** for consistency with other frameworks -2. How to use `ConfigurableHttpPlugin` + `ExpressAdapter` -3. A pattern that matches Hono, Next.js, and other framework integrations +**You manage the server lifecycle**, not the App. The App simply registers the `/api/messages` endpoint on your existing Express server. -## Comparison +## How It Works -**Traditional approach:** ```typescript -import { App, HttpPlugin } from '@microsoft/teams.apps'; +// 1. Create your Express app and server (you own this) +const expressApp = express(); +const httpServer = http.createServer(expressApp); -const app = new App({ - plugins: [new HttpPlugin()] +// Add your custom routes +expressApp.get('/health', (req, res) => { + res.json({ status: 'ok' }); }); -``` -**Adapter pattern (this example):** -```typescript -import { App, ConfigurableHttpPlugin, ExpressAdapter } from '@microsoft/teams.apps'; +// 2. Pass your server to ExpressAdapter +const adapter = new ExpressAdapter(httpServer); +// 3. Create App with the adapter const app = new App({ - plugins: [ - new ConfigurableHttpPlugin(new ExpressAdapter()) - ] + httpAdapter: adapter }); -``` - -Both are functionally equivalent, but the adapter pattern provides: -- **Consistency** across all HTTP frameworks -- **Explicit** framework choice -- **Flexibility** to customize the adapter -## Getting Started +// 4. Initialize (adds /api/messages to your Express app) +await app.initialize(); -1. Install dependencies: -```bash -npm install +// 5. You control the server lifecycle +httpServer.listen(3978); ``` -2. Copy `.env.example` to `.env` and configure: -```bash -cp .env.example .env -``` +## Running -3. Run the development server: ```bash npm run dev ``` -The server will start on `http://localhost:3978` with: -- `/api/messages` - Teams bot endpoint -- Other Express routes can be added - -## How It Works - -```typescript -import { App, ExpressAdapter } from '@microsoft/teams.apps'; - -const app = new App({ - httpAdapter: new ExpressAdapter() -}); -``` - -The `ExpressAdapter` handles: -- Creating and managing the Express app -- Converting between Express format and teams.ts format -- Routing Teams bot requests to `/api/messages` -- Server lifecycle management -- CORS and JSON parsing middleware - -## Adding Custom Routes - -Access the underlying Express app through the adapter: - -```typescript -const adapter = new ExpressAdapter(); - -// Add custom routes -adapter.get('/health', (req, res) => { - res.json({ status: 'ok' }); -}); - -adapter.post('/webhook', (req, res) => { - console.log('Webhook received:', req.body); - res.sendStatus(200); -}); - -const app = new App({ - plugins: [new ConfigurableHttpPlugin(adapter)] -}); -``` - -## Benefits of the Adapter Pattern - -1. **Unified API** - Same pattern for Express, Hono, Next.js, etc. -2. **Framework Flexibility** - Easy to switch frameworks -3. **Clear Separation** - Teams logic separate from HTTP framework -4. **Type Safety** - Full TypeScript support -5. **Extensibility** - Easy to create custom adapters - -## When to Use HttpPlugin vs ExpressAdapter +Server starts on `http://localhost:3978` with: +- Your custom Express routes +- `/api/messages` - Teams bot endpoint (added by teams.ts) -**Use `HttpPlugin`** when: -- You want the simplest possible setup -- You're okay with Express as the default -- You don't need to customize the Express app before initialization +## Why This Pattern? -**Use `ExpressAdapter`** when: -- You want consistency with other framework examples -- You need to customize the Express app setup -- You want explicit control over the HTTP framework -- You're building a multi-framework library +- ✅ Hook teams.ts into your existing Express server +- ✅ You control server startup/shutdown +- ✅ Add Teams bot capabilities to any Express app diff --git a/examples/http-adapters/express/teams-app.ts b/examples/http-adapters/express/teams-app.ts index a88690483..71336b269 100644 --- a/examples/http-adapters/express/teams-app.ts +++ b/examples/http-adapters/express/teams-app.ts @@ -7,11 +7,11 @@ export const expressApp = express(); export const httpServer = http.createServer(expressApp); // Add your custom routes -expressApp.get('/health', (req, res) => { +expressApp.get('/health', (_req, res) => { res.json({ status: 'healthy', timestamp: new Date().toISOString() }); }); -expressApp.get('/api/users', (req, res) => { +expressApp.get('/api/users', (_req, res) => { res.json({ users: [ { id: 1, name: 'Alice' }, @@ -20,7 +20,7 @@ expressApp.get('/api/users', (req, res) => { }); }); -expressApp.get('/', (req, res) => { +expressApp.get('/', (_req, res) => { res.send(` diff --git a/examples/http-adapters/hono/README.md b/examples/http-adapters/hono/README.md index 7147b3dc0..34b13962e 100644 --- a/examples/http-adapters/hono/README.md +++ b/examples/http-adapters/hono/README.md @@ -1,147 +1,49 @@ # Hono + teams.ts Example -This example demonstrates how to **add a Teams bot to your existing Hono server** by "hooking in" the teams.ts adapter. +This example shows how to build a custom HTTP adapter and integrate teams.ts with any framework. -> **Note**: The `HonoAdapter` is included in this example (`hono-adapter.ts`) and is not part of the core `@microsoft/teams.apps` package. You can copy and customize it for your own projects. +## Key Concepts -## Key Concept +**1. Building a custom adapter** - See `hono-adapter.ts` for a minimal `IHttpAdapter` implementation (~60 lines). -You already have a Hono server running with your own routes. You simply pass your Hono app to the adapter, and teams.ts adds the `/api/messages` bot endpoint to your existing server. - -```typescript -// 1. Your existing Hono app -const hono = new Hono(); -hono.get('/health', (c) => c.json({ status: 'ok' })); -hono.get('/api/users', (c) => c.json({ users: [...] })); - -// 2. Hook it into teams.ts -const adapter = new HonoAdapter(hono); // ← Pass YOUR Hono app -const app = new App({ - plugins: [new ConfigurableHttpPlugin(adapter)] -}); - -// 3. Initialize (adds /api/messages to your Hono app) -await app.initialize(); - -// 4. Start your server -await adapter.start(3978); -``` - -## Architecture - -``` -Your Hono App (with your routes) - ↓ - HonoAdapter - ↓ -ConfigurableHttpPlugin - ↓ - teams.ts App - ↓ -/api/messages route added to your Hono app -``` - -## Getting Started - -1. Install dependencies: -```bash -cd examples/http-adapters -npm install -``` - -2. Copy `.env.example` to `.env` and configure: -```bash -cp .env.example .env -``` - -3. Run the Hono example: -```bash -npm run dev:hono -``` - -The server will start on `http://localhost:3978` with: -- `/` - Homepage -- `/health` - Health check endpoint -- `/api/users` - Example API endpoint -- `/api/messages` - Teams bot endpoint (added by teams.ts) - -Open http://localhost:3978 in your browser to see all available routes! +**2. Lifecycle options** - Two approaches: +- Implement `start()` in your adapter, then call `app.start()` +- Call `app.initialize()` and manage the server yourself ← This example ## How It Works -### 1. Create Your Hono App (`teams-app.ts`) - ```typescript -import { Hono } from 'hono'; - -// Your existing Hono app with your routes +// Create Hono app with your routes const hono = new Hono(); +hono.get('/health', (c) => c.json({ status: 'ok' })); -hono.get('/health', (c) => { - return c.json({ status: 'healthy' }); -}); - -hono.get('/api/users', (c) => { - return c.json({ users: [...] }); -}); -``` - -### 2. Hook Into teams.ts - -```typescript -import { App } from '@microsoft/teams.apps'; -import { HonoAdapter } from './hono-adapter'; - -// Pass YOUR Hono app to the adapter +// Create adapter and App const adapter = new HonoAdapter(hono); - -// Create teams.ts app -const app = new App({ - httpAdapter: adapter -}); - -// Handle bot messages +const app = new App({ httpAdapter: adapter }); app.on('message', async ({ send, activity }) => { await send(`Echo: ${activity.text}`); }); -``` -### 3. Start Your Server (`index.ts`) - -```typescript -// Initialize teams.ts (adds /api/messages to your Hono app) +// Initialize adds /api/messages to your Hono app await app.initialize(); -// Start YOUR Hono server -await adapter.start(3978); +// You control the server lifecycle +serve({ fetch: hono.fetch, port: 3978 }); ``` -## What the HonoAdapter Does - -The adapter bridges your Hono app with teams.ts: +## Running -1. **Accepts your existing Hono app** - You pass your `Hono` instance to the adapter -2. **Adds Teams bot routes** - When `app.initialize()` is called, it adds `/api/messages` to your Hono app -3. **Converts requests/responses** - Translates between Hono's Web API format and teams.ts format -4. **Manages the server** - Handles starting/stopping the Node.js HTTP server - -## Benefits of Hono +```bash +npm run dev:hono +``` -- **Fast** - One of the fastest Node.js frameworks -- **Lightweight** - Minimal dependencies (~12KB) -- **Web Standards** - Uses Web API (Request/Response) -- **TypeScript** - First-class TypeScript support -- **Middleware** - Rich middleware ecosystem -- **Flexible** - Works with any Node.js server or edge runtime +Server starts on `http://localhost:3978` with: +- Your custom Hono routes +- `/api/messages` - Teams bot endpoint ## Why This Pattern? -This pattern demonstrates that teams.ts doesn't take over your server - it integrates with your existing setup: - -✅ You control your Hono app and routes -✅ You can add/remove routes anytime -✅ teams.ts just adds the `/api/messages` endpoint -✅ Everything runs on a single port -✅ No conflicts between your app and the bot - -This is perfect for adding bot functionality to an existing API server! +- ✅ Use any HTTP framework +- ✅ Full control over server lifecycle +- ✅ Simple adapter implementation +- ✅ Add Teams bot to existing apps diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts index ac7aac47d..247bcc1b4 100644 --- a/examples/http-adapters/nextjs/nextjs-adapter.ts +++ b/examples/http-adapters/nextjs/nextjs-adapter.ts @@ -9,7 +9,13 @@ import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adap * - Next.js app preparation and initialization * - Route interception for Teams bot endpoints * - Fallback to Next.js handler for all other routes - * - Server lifecycle management + * + * Usage: + * const server = http.createServer(); + * const adapter = new NextjsAdapter(server); + * const app = new App({ httpAdapter: adapter }); + * await app.initialize(); + * server.listen(3978); */ export class NextjsAdapter implements IHttpAdapter { protected nextApp: ReturnType; @@ -18,7 +24,8 @@ export class NextjsAdapter implements IHttpAdapter { protected dev: boolean; protected requestHandlerAttached: boolean = false; - constructor(server?: http.Server, options?: { dev?: boolean; dir?: string }) { + constructor(server: http.Server, options?: { dev?: boolean; dir?: string }) { + this.server = server; this.dev = options?.dev ?? process.env.NODE_ENV !== 'production'; // Create Next.js app @@ -26,9 +33,6 @@ export class NextjsAdapter implements IHttpAdapter { dev: this.dev, dir: options?.dir }); - - // Create server - this.server = server || http.createServer(); } /** @@ -108,38 +112,11 @@ export class NextjsAdapter implements IHttpAdapter { } }; - // Attach request handler to the server created in constructor + // Attach request handler to the server this.server.on('request', requestHandler); this.requestHandlerAttached = true; } - /** - * Start the server listening on the specified port - */ - async start(port: number): Promise { - return new Promise((resolve, reject) => { - this.server.listen(port, () => { - resolve(); - }); - this.server.once('error', reject); - }); - } - - /** - * Stop the server and close all connections - */ - async stop(): Promise { - return new Promise((resolve, reject) => { - this.server.close((err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - } - /** * Parse request body */ diff --git a/examples/http-adapters/nextjs/server.ts b/examples/http-adapters/nextjs/server.ts index 848ff3e0a..480545099 100644 --- a/examples/http-adapters/nextjs/server.ts +++ b/examples/http-adapters/nextjs/server.ts @@ -1,5 +1,5 @@ import 'dotenv/config'; -import { app, adapter } from './teams-app'; +import { app, httpServer } from './teams-app'; const port = parseInt(process.env.PORT || '3978', 10); @@ -7,16 +7,12 @@ async function main() { // Initialize the app (registers routes with adapter) await app.initialize(); - // Manually start the server - if (adapter.start) { - await adapter.start(port); - } else { - throw new Error('Adapter does not support start()'); - } - - console.log(`> Server ready on http://localhost:${port}`); - console.log(`> Teams bot endpoint: /api/messages`); - console.log(`> Next.js pages are served alongside Teams bot routes`); + // Start your server (you control the lifecycle) + httpServer.listen(port, () => { + console.log(`> Server ready on http://localhost:${port}`); + console.log(`> Teams bot endpoint: /api/messages`); + console.log(`> Next.js pages are served alongside Teams bot routes`); + }); } main().catch((err) => { diff --git a/examples/http-adapters/nextjs/teams-app.ts b/examples/http-adapters/nextjs/teams-app.ts index bc70d2519..bed9b70cc 100644 --- a/examples/http-adapters/nextjs/teams-app.ts +++ b/examples/http-adapters/nextjs/teams-app.ts @@ -1,23 +1,21 @@ +import http from 'http'; import { App } from '@microsoft/teams.apps'; import { NextjsAdapter } from './nextjs-adapter'; -import { fileURLToPath } from 'url'; -import { dirname } from 'path'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +// 1. Create HTTP server (you own this) +export const httpServer = http.createServer(); -// 1. Create Next.js adapter -export const adapter = new NextjsAdapter(undefined, { - dev: process.env.NODE_ENV !== 'production', - dir: __dirname +// 2. Create Next.js adapter with your server +export const adapter = new NextjsAdapter(httpServer, { + dev: process.env.NODE_ENV !== 'production' }); -// 2. Create teams.ts app with the adapter +// 3. Create teams.ts app with the adapter export const app = new App({ httpAdapter: adapter }); -// 3. Handle incoming messages +// 4. Handle incoming messages app.on('message', async ({ send, activity }) => { await send(`Echo from Next.js + teams.ts: ${activity.text}`); }); From df71c55e943e46500f3791f592b44739fddf5c62 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 23 Jan 2026 16:46:01 -0800 Subject: [PATCH 22/33] Fix readme --- examples/http-adapters/README.md | 237 ++----------------------------- 1 file changed, 10 insertions(+), 227 deletions(-) diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md index 27887b5f0..14861e38b 100644 --- a/examples/http-adapters/README.md +++ b/examples/http-adapters/README.md @@ -1,244 +1,27 @@ # HTTP Adapter Examples -This example demonstrates how to use **teams.ts** with different HTTP frameworks through custom adapters. +This example shows how to integrate teams.ts with different HTTP frameworks using custom adapters. -## What is an HTTP Adapter? +## What's an Adapter? -An HTTP adapter bridges a specific HTTP framework (Express, Hono, Next.js, etc.) with teams.ts. This allows you to: +An adapter bridges your HTTP framework with teams.ts. You create your server, pass it to the adapter, and teams.ts adds the `/api/messages` bot endpoint to your existing app. -- ✅ Use any HTTP framework you prefer -- ✅ Co-locate your bot with existing web applications -- ✅ Maintain full control over server lifecycle -- ✅ Add custom routes alongside your Teams bot +## Examples -## Structure +- **[express/](./express/)** - Hook teams.ts into an existing Express server +- **[hono/](./hono/)** - Build a custom adapter (Hono example) +- **[nextjs/](./nextjs/)** - Integrate with Next.js app -This example contains three different adapter implementations in separate folders: +## Running -``` -adapters/ -├── express/ # Express adapter (recommended for most) -│ ├── index.ts -│ ├── express-adapter.ts -│ └── teams-app.ts -├── hono/ # Hono adapter (fastest & modern) -│ ├── index.ts -│ ├── hono-adapter.ts -│ └── teams-app.ts -└── nextjs/ # Next.js adapter (full-stack) - ├── server.ts - ├── nextjs-adapter.ts - ├── teams-app.ts - └── app/ # Next.js pages -``` - -## Getting Started - -1. Install dependencies: ```bash npm install -``` - -2. Copy `.env.example` to `.env` and configure: -```bash cp .env.example .env -``` -3. Run the adapter you want to try: -```bash -# Run Express adapter +# Run an example npm run dev:express - -# Run Hono adapter npm run dev:hono - -# Run Next.js adapter npm run dev:nextjs ``` -All adapters start on `http://localhost:3978` with the Teams bot endpoint at `/api/messages`. - -## Architecture - -``` -┌─────────────────┐ -│ teams.ts App │ -│ │ -│ ┌───────────┐ │ -│ │HttpServer │ │ ← Teams bot infrastructure (framework-agnostic) -│ └─────┬──────┘ │ -└────────┼─────────┘ - │ - ┌────▼────┐ - │ Adapter │ ← Framework-specific implementation - └────┬────┘ - │ - ┌────▼────────┐ - │ Framework │ ← Express / Hono / Next.js / etc. - │ (HTTP) │ - └─────────────┘ -``` - -## Adapter Implementations - -### 1. Express ([`express/`](./express/)) - -The most common adapter using Express.js. - -**When to use:** -- Starting a new Teams bot project -- You want a simple, well-documented solution -- You need middleware ecosystem (CORS, body parsing, etc.) -- Your team is familiar with Express - -**Key features:** -- Rich middleware ecosystem -- Easy to add custom routes -- Built-in static file serving - -**Usage:** -```bash -npm run dev:express -``` - -See [express/README.md](./express/README.md) for details. - -### 2. Hono ([`hono/`](./hono/)) - -Ultra-fast, lightweight web framework with Web Standards API. - -**When to use:** -- Performance is critical -- You want a modern, TypeScript-first framework -- You prefer Web Standards (Request/Response) over Express -- You want minimal dependencies - -**Key features:** -- One of the fastest Node.js frameworks -- Lightweight with minimal dependencies -- Web Standards API (Request/Response) -- Excellent TypeScript support - -**Usage:** -```bash -npm run dev:hono -``` - -See [hono/README.md](./hono/README.md) for details. - -### 3. Next.js ([`nextjs/`](./nextjs/)) - -Combines a Teams bot with a Next.js web application in a single server. - -**When to use:** -- You have an existing Next.js app and want to add a bot -- You want a web UI and bot in the same project -- You need server-side rendering (SSR) or static generation -- You want React-based admin/config pages for your bot - -**Key features:** -- Bot and web UI in one codebase -- Share code between bot and web app -- Next.js handles all non-bot routes -- Server-side rendering for web pages - -**Usage:** -```bash -npm run dev:nextjs -``` - -See [nextjs/README.md](./nextjs/README.md) for details. - -## Quick Comparison - -| Feature | Express | Hono | Next.js | -|---------|---------|------|---------| -| **Performance** | Good | Excellent | Good | -| **Bundle Size** | Medium | Small | Large | -| **Learning Curve** | Easy | Easy | Medium | -| **Use Case** | General purpose | High performance | Full-stack app | -| **Web UI** | Manual setup | Manual setup | Built-in (React) | -| **TypeScript** | Good | Excellent | Excellent | -| **Middleware** | Rich ecosystem | Growing | Next.js specific | - -## How Adapters Work - -All adapters implement the `IHttpAdapter` interface: - -```typescript -interface IHttpAdapter { - /** - * Register a POST route handler - * All routes are POST-only (Teams bot protocol uses POST) - */ - registerRouteHandler(config: IRouteConfig): void; - - /** - * Serve static files from a directory - * Primarily used for serving static files like for tabs - */ - serveStatic?(path: string, directory: string): void; - - /** - * Optional framework-specific initialization - * Called when app.initialize() or app.start() is invoked if any prep is needed - */ - initialize?(): Promise; - - /** - * Start the server listening to incoming requests - * Not needed if app.start() is not called - */ - start?(port: number): Promise; - - /** - * Stop the server from listening and perform any cleanup that needs to be done - */ - stop?(): Promise; -} - -interface IRouteConfig { - path: string; - handler: (helpers: IRequestHelpers) => Promise; -} -``` - -## Usage Pattern - -All adapters follow the same pattern: - -```typescript -import { App } from '@microsoft/teams.apps'; -import { MyAdapter } from './my-adapter'; - -// 1. Create adapter -const adapter = new MyAdapter(); - -// 2. Create teams.ts app with adapter -const app = new App({ - httpAdapter: adapter -}); - -// 3. Start the app -await app.start(3978); -``` - -## Creating Your Own Adapter - -Want to use a different framework? Creating an adapter is straightforward: - -1. Implement the `IHttpAdapter` interface -2. Convert between your framework's request/response format and teams.ts format -3. Register routes by calling the handler when requests match - -See the adapter implementations in this example for reference: -- [express-adapter.ts](./express/express-adapter.ts) - Most straightforward -- [hono-adapter.ts](./hono/hono-adapter.ts) - Web Standards API -- [nextjs-adapter.ts](./nextjs/nextjs-adapter.ts) - Complex integration - -## Additional Resources - -- [teams.ts Documentation](https://github.com/microsoft/teams.ts) -- [Express Documentation](https://expressjs.com/) -- [Hono Documentation](https://hono.dev/) -- [Next.js Documentation](https://nextjs.org/) +All examples start on `http://localhost:3978` with `/api/messages` as the bot endpoint. From a4c63e288aaea83bb8327cda28002447095c5dfe Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Fri, 23 Jan 2026 22:26:34 -0800 Subject: [PATCH 23/33] Fix --- packages/apps/src/app.embed.ts | 52 ++--- packages/apps/src/app.ts | 5 +- packages/apps/src/http/adapter.ts | 2 +- packages/apps/src/http/express-adapter.ts | 25 ++- packages/apps/src/http/http-server.ts | 48 +--- .../src/middleware/auth/jwt-validator.spec.ts | 39 +--- .../apps/src/middleware/auth/jwt-validator.ts | 17 -- .../auth/remote-function-validator.spec.ts | 211 ++++++++++++++++++ .../auth/remote-function-validator.ts | 84 +++++++ .../auth/service-token-validator.spec.ts | 171 ++++++++++++++ .../auth/service-token-validator.ts | 58 +++++ packages/apps/src/middleware/index.ts | 2 + .../middleware/jwt-validation-middleware.ts | 29 ++- ...ith-remote-function-jwt-validation.spec.ts | 197 +++++++++------- .../with-remote-function-jwt-validation.ts | 57 ++--- 15 files changed, 736 insertions(+), 261 deletions(-) create mode 100644 packages/apps/src/middleware/auth/remote-function-validator.spec.ts create mode 100644 packages/apps/src/middleware/auth/remote-function-validator.ts create mode 100644 packages/apps/src/middleware/auth/service-token-validator.spec.ts create mode 100644 packages/apps/src/middleware/auth/service-token-validator.ts diff --git a/packages/apps/src/app.embed.ts b/packages/apps/src/app.embed.ts index 5fd1882db..91580c2d7 100644 --- a/packages/apps/src/app.embed.ts +++ b/packages/apps/src/app.embed.ts @@ -1,8 +1,9 @@ import { ActivityLike } from '@microsoft/teams.api'; import { App } from './app'; -import { IClientContext, IFunctionContext } from './contexts'; +import { IFunctionContext } from './contexts'; import * as manifest from './manifest'; +import { RemoteFunctionValidator } from './middleware/auth/remote-function-validator'; import { IPlugin } from './types'; import { functionContext } from './utils'; @@ -19,51 +20,28 @@ export function func( const log = this.log.child('functions').child(name); const entraTokenValidator = this.entraTokenValidator; + // Create the remote function validator once + const validator = entraTokenValidator + ? new RemoteFunctionValidator(entraTokenValidator, log) + : null; + this.server.registerRouteHandler({ path: `/api/functions/${name}`, handler: async (helpers) => { const { body, headers } = helpers.extractRequestData(); - // Extract and validate JWT token - const appSessionId = headers['x-teams-app-session-id']; - const pageId = headers['x-teams-page-id']; - const authorization = headers['authorization']?.split(' '); - const authToken = - authorization?.length === 2 && authorization[0].toLowerCase() === 'bearer' - ? authorization[1] - : ''; - - const tokenPayload = !entraTokenValidator - ? null - : await entraTokenValidator.validateAccessToken(authToken); - - if ( - !pageId || - !appSessionId || - !authToken || - !entraTokenValidator || - !tokenPayload - ) { - log.debug('unauthorized'); + // Validate JWT token and extract context + if (!validator) { + log.debug('unauthorized - no token validator configured'); helpers.sendResponse({ status: 401, body: 'unauthorized' }); return; } - const context: IClientContext = { - appId: tokenPayload?.['appId'], - appSessionId, - authToken, - channelId: headers['x-teams-channel-id'], - chatId: headers['x-teams-chat-id'], - meetingId: headers['x-teams-meeting-id'], - messageId: headers['x-teams-message-id'], - pageId, - subPageId: headers['x-teams-sub-page-id'], - teamId: headers['x-teams-team-id'], - tenantId: tokenPayload['tid'], - userId: tokenPayload['oid'], - userName: tokenPayload['name'], - }; + const context = await validator.check(headers); + if (!context) { + helpers.sendResponse({ status: 401, body: 'unauthorized' }); + return; + } const getCurrentConversationId = functionContext.getConversationIdResolver( diff --git a/packages/apps/src/app.ts b/packages/apps/src/app.ts index 80eeeed52..5dda71af6 100644 --- a/packages/apps/src/app.ts +++ b/packages/apps/src/app.ts @@ -326,7 +326,10 @@ export class App { throw new Error('HttpPlugin.asServer() returned undefined'); } } else { - server = new HttpServer(this.options.httpAdapter ?? new ExpressAdapter(), { + server = new HttpServer(this.options.httpAdapter ?? new ExpressAdapter(undefined, { + logger: this.log, + onError: (err) => this.onError({ error: err }) + }), { skipAuth: this.options.skipAuth, logger: this.log }); diff --git a/packages/apps/src/http/adapter.ts b/packages/apps/src/http/adapter.ts index 774ebcd80..d9f41afb0 100644 --- a/packages/apps/src/http/adapter.ts +++ b/packages/apps/src/http/adapter.ts @@ -42,7 +42,7 @@ export interface IHttpAdapter { /** * Serve static files from a directory - * Primarily used for serving static files like for tabs + * Primarily used for serving static files like for tabs, or static pages via MessageExtensions and Dialogs * @param path URL path prefix (e.g., '/static') * @param directory File system directory to serve from */ diff --git a/packages/apps/src/http/express-adapter.ts b/packages/apps/src/http/express-adapter.ts index 2ef47d6d8..1c759aa92 100644 --- a/packages/apps/src/http/express-adapter.ts +++ b/packages/apps/src/http/express-adapter.ts @@ -3,6 +3,8 @@ import http from 'http'; import cors from 'cors'; import express from 'express'; +import { ConsoleLogger, ILogger } from '@microsoft/teams.common'; + import { IHttpAdapter, IRouteConfig } from './adapter'; /** @@ -26,11 +28,15 @@ export class ExpressAdapter implements IHttpAdapter { protected express: express.Application; protected server: http.Server; + protected logger: ILogger; + protected onError?: (err: Error) => void; - constructor(server?: http.Server) { + constructor(server?: http.Server, options?: { logger?: ILogger; onError?: (err: Error) => void }) { this.express = express(); this.server = server || http.createServer(); this.server.on('request', this.express); + this.logger = options?.logger ?? new ConsoleLogger('ExpressAdapter'); + this.onError = options?.onError; // Bind Express methods this.get = this.express.get.bind(this.express); @@ -92,10 +98,24 @@ export class ExpressAdapter implements IHttpAdapter { */ async start(port: number): Promise { return new Promise((resolve, reject) => { + // Handle startup errors + this.server.once('error', (err) => { + if (this.onError) { + this.onError(err); + } + reject(err); + }); + this.server.listen(port, () => { + this.logger.info(`listening on port ${port} 🚀`); + + // Set up persistent error listener after startup + if (this.onError) { + this.server.on('error', this.onError); + } + resolve(); }); - this.server.once('error', reject); }); } @@ -115,6 +135,7 @@ export class ExpressAdapter implements IHttpAdapter { if (err) { reject(err); } else { + this.logger.info('server stopped'); resolve(); } }); diff --git a/packages/apps/src/http/http-server.ts b/packages/apps/src/http/http-server.ts index 249b24d91..67e4a990c 100644 --- a/packages/apps/src/http/http-server.ts +++ b/packages/apps/src/http/http-server.ts @@ -7,7 +7,7 @@ import { import { ConsoleLogger, ILogger } from '@microsoft/teams.common'; import { IActivityEvent } from '../events'; -import { createServiceTokenValidator, JwtValidator } from '../middleware/auth/jwt-validator'; +import { ServiceTokenValidator } from '../middleware/auth/service-token-validator'; import { IHttpAdapter, IRequestHelpers, IRouteConfig } from './adapter'; @@ -53,7 +53,7 @@ export class HttpServer implements IHttpServer { protected credentials?: Credentials; protected skipAuth: boolean; protected initialized: boolean = false; - protected jwtValidator?: JwtValidator; + protected serviceTokenValidator?: ServiceTokenValidator; private _adapter: IHttpAdapter; @@ -86,9 +86,9 @@ export class HttpServer implements IHttpServer { this.credentials = deps.credentials; - // Initialize JWT validator if credentials provided and auth not skipped + // Initialize service token validator if credentials provided and auth not skipped if (this.credentials && !this.skipAuth) { - this.jwtValidator = createServiceTokenValidator( + this.serviceTokenValidator = new ServiceTokenValidator( this.credentials.clientId, this.credentials.tenantId, undefined, // serviceUrl will be validated from activity body @@ -125,7 +125,6 @@ export class HttpServer implements IHttpServer { ); } await this._adapter.start(portNumber); - this.logger.info(`listening on port ${port} 🚀`); } /** @@ -138,7 +137,6 @@ export class HttpServer implements IHttpServer { return; } await this._adapter.stop(); - this.logger.info('server stopped'); } /** @@ -183,8 +181,12 @@ export class HttpServer implements IHttpServer { return; } + if (!this.serviceTokenValidator) { + throw new Error('Service token validator not initialized - credentials required'); + } + try { - token = await this.validateJwt(authHeader, body); + token = await this.serviceTokenValidator.check(authHeader, body); } catch (err) { this.logger.error('JWT validation failed', err); sendResponse({ @@ -228,36 +230,4 @@ export class HttpServer implements IHttpServer { } } - /** - * Validate JWT token - * Uses JwtValidator for proper Bot Framework token validation - */ - protected async validateJwt(authHeader: string, body: any): Promise { - if (!this.jwtValidator) { - throw new Error('JWT validator not initialized - credentials required'); - } - - // Extract token from "Bearer " format - const token = authHeader.startsWith('Bearer ') - ? authHeader.substring(7) - : authHeader; - - // Validate token using service token validator - const payload = await this.jwtValidator.validateAccessToken(token, { - validateServiceUrl: body.serviceUrl ? { expectedServiceUrl: body.serviceUrl } : undefined - }); - - if (!payload) { - throw new Error('Invalid token'); - } - - // Convert JWT payload to IToken - return { - appId: payload.appid as string || this.credentials?.clientId || '', - from: 'azure', - fromId: payload.sub as string || '', - serviceUrl: body.serviceUrl || payload.serviceurl as string || '', - isExpired: () => false, // Already validated by JWT validator - }; - } } diff --git a/packages/apps/src/middleware/auth/jwt-validator.spec.ts b/packages/apps/src/middleware/auth/jwt-validator.spec.ts index 60398f969..af9b56f50 100644 --- a/packages/apps/src/middleware/auth/jwt-validator.spec.ts +++ b/packages/apps/src/middleware/auth/jwt-validator.spec.ts @@ -2,7 +2,7 @@ import crypto from 'crypto'; import jwt from 'jsonwebtoken'; -import { JwtValidator, createEntraTokenValidator, createServiceTokenValidator } from './jwt-validator'; +import { JwtValidator, createEntraTokenValidator } from './jwt-validator'; // Generate test RSA key pair const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', { @@ -573,43 +573,6 @@ describe('JwtValidator', () => { }); }); - describe('createServiceTokenValidator', () => { - it('should create validator with minimal options', () => { - const validator = createServiceTokenValidator(mockClientId, mockTenantId); - - expect(validator).toBeInstanceOf(JwtValidator); - expect(validator.options.clientId).toBe(mockClientId); - expect(validator.options.tenantId).toBe(mockTenantId); - expect(validator.options.validateIssuer).toEqual({ - allowedIssuer: 'https://api.botframework.com' - }); - expect(validator.options.jwksUriOptions).toEqual({ - type: 'uri', - uri: 'https://login.botframework.com/v1/.well-known/keys' - }); - }); - - it('should create validator with service URL', () => { - const serviceUrl = 'https://example.com/api'; - const validator = createServiceTokenValidator(mockClientId, mockTenantId, serviceUrl); - - expect(validator.options.validateServiceUrl).toEqual({ - expectedServiceUrl: serviceUrl - }); - }); - - it('should create validator without service URL validation when not provided', () => { - const validator = createServiceTokenValidator(mockClientId, mockTenantId); - - expect(validator.options.validateServiceUrl).toBeUndefined(); - }); - - it('should create validator with logger', () => { - const validator = createServiceTokenValidator(mockClientId, mockTenantId, undefined, mockLogger); - - expect(validator).toBeInstanceOf(JwtValidator); - }); - }); }); describe('error handling and logging', () => { diff --git a/packages/apps/src/middleware/auth/jwt-validator.ts b/packages/apps/src/middleware/auth/jwt-validator.ts index 8d4693e2d..105da21b6 100644 --- a/packages/apps/src/middleware/auth/jwt-validator.ts +++ b/packages/apps/src/middleware/auth/jwt-validator.ts @@ -267,20 +267,3 @@ export const createEntraTokenValidator = ( }, options?.logger); }; -export const createServiceTokenValidator = ( - appId: string, - tenantId?: string, - serviceUrl?: string, - logger?: ILogger -) => { - return new JwtValidator({ - clientId: appId, - tenantId, - validateIssuer: { allowedIssuer: 'https://api.botframework.com' }, - validateServiceUrl: serviceUrl ? { expectedServiceUrl: serviceUrl } : undefined, - jwksUriOptions: { - type: 'uri', - uri: 'https://login.botframework.com/v1/.well-known/keys' - }, - }, logger); -}; \ No newline at end of file diff --git a/packages/apps/src/middleware/auth/remote-function-validator.spec.ts b/packages/apps/src/middleware/auth/remote-function-validator.spec.ts new file mode 100644 index 000000000..2bbd24345 --- /dev/null +++ b/packages/apps/src/middleware/auth/remote-function-validator.spec.ts @@ -0,0 +1,211 @@ +import { ConsoleLogger } from '@microsoft/teams.common'; + +import { RemoteFunctionValidator } from './remote-function-validator'; + +describe('RemoteFunctionValidator', () => { + const mockLogger = { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + child: jest.fn().mockReturnThis() + } as unknown as ConsoleLogger; + + const mockEntraValidator = { + validateAccessToken: jest.fn() + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('check', () => { + it('should validate token and return client context', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const mockPayload = { + appId: 'app-123', + tid: 'tenant-123', + oid: 'user-123', + name: 'Test User' + }; + + mockEntraValidator.validateAccessToken.mockResolvedValue(mockPayload); + + const headers = { + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'session-123', + 'x-teams-page-id': 'page-123', + 'x-teams-channel-id': 'channel-123', + 'x-teams-chat-id': 'chat-123', + 'x-teams-meeting-id': 'meeting-123', + 'x-teams-message-id': 'message-123', + 'x-teams-sub-page-id': 'subpage-123', + 'x-teams-team-id': 'team-123' + }; + + const result = await validator.check(headers); + + expect(result).toEqual({ + appId: 'app-123', + appSessionId: 'session-123', + authToken: 'valid-token', + channelId: 'channel-123', + chatId: 'chat-123', + meetingId: 'meeting-123', + messageId: 'message-123', + pageId: 'page-123', + subPageId: 'subpage-123', + teamId: 'team-123', + tenantId: 'tenant-123', + userId: 'user-123', + userName: 'Test User' + }); + + expect(mockEntraValidator.validateAccessToken).toHaveBeenCalledWith('valid-token'); + }); + + it('should return null if pageId is missing', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const headers = { + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'session-123' + // x-teams-page-id missing + }; + + const result = await validator.check(headers); + + expect(result).toBeNull(); + expect(mockLogger.debug).toHaveBeenCalledWith('unauthorized - missing required headers or invalid token'); + }); + + it('should return null if appSessionId is missing', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const headers = { + 'authorization': 'Bearer valid-token', + 'x-teams-page-id': 'page-123' + // x-teams-app-session-id missing + }; + + const result = await validator.check(headers); + + expect(result).toBeNull(); + }); + + it('should return null if authorization header is missing', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const headers = { + 'x-teams-app-session-id': 'session-123', + 'x-teams-page-id': 'page-123' + // authorization missing + }; + + const result = await validator.check(headers); + + expect(result).toBeNull(); + }); + + it('should return null if token validation fails', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + mockEntraValidator.validateAccessToken.mockResolvedValue(null); + + const headers = { + 'authorization': 'Bearer invalid-token', + 'x-teams-app-session-id': 'session-123', + 'x-teams-page-id': 'page-123' + }; + + const result = await validator.check(headers); + + expect(result).toBeNull(); + }); + + it('should extract token from Bearer prefix', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const mockPayload = { + appId: 'app-123', + tid: 'tenant-123', + oid: 'user-123', + name: 'Test User' + }; + + mockEntraValidator.validateAccessToken.mockResolvedValue(mockPayload); + + const headers = { + 'authorization': 'Bearer test-token', + 'x-teams-app-session-id': 'session-123', + 'x-teams-page-id': 'page-123' + }; + + await validator.check(headers); + + expect(mockEntraValidator.validateAccessToken).toHaveBeenCalledWith('test-token'); + }); + + it('should handle authorization header with different casing', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const mockPayload = { + appId: 'app-123', + tid: 'tenant-123', + oid: 'user-123', + name: 'Test User' + }; + + mockEntraValidator.validateAccessToken.mockResolvedValue(mockPayload); + + const headers = { + 'authorization': 'BEARER test-token', + 'x-teams-app-session-id': 'session-123', + 'x-teams-page-id': 'page-123' + }; + + await validator.check(headers); + + expect(mockEntraValidator.validateAccessToken).toHaveBeenCalledWith('test-token'); + }); + + it('should handle optional headers as undefined', async () => { + const validator = new RemoteFunctionValidator(mockEntraValidator, mockLogger); + + const mockPayload = { + appId: 'app-123', + tid: 'tenant-123', + oid: 'user-123', + name: 'Test User' + }; + + mockEntraValidator.validateAccessToken.mockResolvedValue(mockPayload); + + const headers = { + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'session-123', + 'x-teams-page-id': 'page-123' + // All optional headers missing + }; + + const result = await validator.check(headers); + + expect(result).toEqual({ + appId: 'app-123', + appSessionId: 'session-123', + authToken: 'valid-token', + channelId: undefined, + chatId: undefined, + meetingId: undefined, + messageId: undefined, + pageId: 'page-123', + subPageId: undefined, + teamId: undefined, + tenantId: 'tenant-123', + userId: 'user-123', + userName: 'Test User' + }); + }); + }); +}); diff --git a/packages/apps/src/middleware/auth/remote-function-validator.ts b/packages/apps/src/middleware/auth/remote-function-validator.ts new file mode 100644 index 000000000..b80ef5bb8 --- /dev/null +++ b/packages/apps/src/middleware/auth/remote-function-validator.ts @@ -0,0 +1,84 @@ +import { ILogger } from '@microsoft/teams.common'; + +import { IClientContext } from '../../contexts'; + +import { JwtValidator } from './jwt-validator'; + +/** + * Remote function validator for /api/functions/* requests + * Wraps an Entra token validator and provides a simple check() method + */ +export class RemoteFunctionValidator { + private entraTokenValidator: Pick; + private logger: ILogger; + + constructor(entraTokenValidator: Pick, logger: ILogger) { + this.entraTokenValidator = entraTokenValidator; + this.logger = logger; + } + + /** + * Create a remote function validator for Entra tokens + */ + static create( + tenantId: string, + clientId: string, + logger: ILogger, + options?: { + allowedTenantIds?: string[]; + requiredScope?: string; + } + ): RemoteFunctionValidator { + const jwtValidator = new JwtValidator({ + clientId, + tenantId, + validateIssuer: { + allowedTenantIds: options?.allowedTenantIds + }, + validateScope: options?.requiredScope ? { requiredScope: options.requiredScope } : undefined, + jwksUriOptions: { + type: 'tenantId' + } + }, logger); + + return new RemoteFunctionValidator(jwtValidator, logger); + } + + async check(headers: Record): Promise { + const appSessionId = headers['x-teams-app-session-id']; + const pageId = headers['x-teams-page-id']; + const authorization = headers['authorization']?.split(' '); + const authToken = + authorization?.length === 2 && authorization[0].toLowerCase() === 'bearer' + ? authorization[1] + : ''; + + const tokenPayload = await this.entraTokenValidator.validateAccessToken(authToken); + + if ( + !pageId || + !appSessionId || + !authToken || + !tokenPayload + ) { + this.logger.debug('unauthorized - missing required headers or invalid token'); + return null; + } + + return { + appId: tokenPayload?.['appId'], + appSessionId, + authToken, + channelId: headers['x-teams-channel-id'], + chatId: headers['x-teams-chat-id'], + meetingId: headers['x-teams-meeting-id'], + messageId: headers['x-teams-message-id'], + pageId, + subPageId: headers['x-teams-sub-page-id'], + teamId: headers['x-teams-team-id'], + tenantId: tokenPayload['tid'], + userId: tokenPayload['oid'], + userName: tokenPayload['name'], + }; + } +} diff --git a/packages/apps/src/middleware/auth/service-token-validator.spec.ts b/packages/apps/src/middleware/auth/service-token-validator.spec.ts new file mode 100644 index 000000000..3104440bd --- /dev/null +++ b/packages/apps/src/middleware/auth/service-token-validator.spec.ts @@ -0,0 +1,171 @@ +import { JwtValidator } from './jwt-validator'; +import { ServiceTokenValidator } from './service-token-validator'; + +// Mock JwtValidator +jest.mock('./jwt-validator'); + +describe('ServiceTokenValidator', () => { + const mockClientId = 'test-client-id'; + const mockTenantId = 'test-tenant-id'; + const mockServiceUrl = 'https://smba.trafficmanager.net/amer/'; + + let mockValidateAccessToken: jest.Mock; + + beforeEach(() => { + mockValidateAccessToken = jest.fn(); + (JwtValidator as jest.Mock).mockImplementation(() => ({ + validateAccessToken: mockValidateAccessToken + })); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + describe('check', () => { + it('should extract token from Bearer prefix and convert payload to IToken', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + const mockPayload = { + appid: mockClientId, + sub: 'bot-id', + serviceurl: mockServiceUrl + }; + + mockValidateAccessToken.mockResolvedValue(mockPayload); + + const authHeader = 'Bearer test-token'; + const body = { serviceUrl: mockServiceUrl }; + + const result = await validator.check(authHeader, body); + + expect(mockValidateAccessToken).toHaveBeenCalledWith('test-token', { + validateServiceUrl: { expectedServiceUrl: mockServiceUrl } + }); + + expect(result).toEqual({ + appId: mockClientId, + from: 'azure', + fromId: 'bot-id', + serviceUrl: mockServiceUrl, + isExpired: expect.any(Function) + }); + expect(result.isExpired()).toBe(false); + }); + + it('should handle token without Bearer prefix', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + const mockPayload = { + appid: mockClientId, + sub: 'bot-id', + serviceurl: mockServiceUrl + }; + + mockValidateAccessToken.mockResolvedValue(mockPayload); + + const token = 'test-token'; + const body = { serviceUrl: mockServiceUrl }; + + await validator.check(token, body); + + expect(mockValidateAccessToken).toHaveBeenCalledWith('test-token', { + validateServiceUrl: { expectedServiceUrl: mockServiceUrl } + }); + }); + + it('should throw error when payload is null', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + mockValidateAccessToken.mockResolvedValue(null); + + const authHeader = 'Bearer invalid-token'; + const body = { serviceUrl: mockServiceUrl }; + + await expect(validator.check(authHeader, body)).rejects.toThrow('Invalid token'); + }); + + it('should pass serviceUrl validation option from request body', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + const mockPayload = { + appid: mockClientId, + sub: 'bot-id', + serviceurl: mockServiceUrl + }; + + mockValidateAccessToken.mockResolvedValue(mockPayload); + + const authHeader = 'Bearer test-token'; + const body = { serviceUrl: mockServiceUrl }; + + await validator.check(authHeader, body); + + expect(mockValidateAccessToken).toHaveBeenCalledWith('test-token', { + validateServiceUrl: { expectedServiceUrl: mockServiceUrl } + }); + }); + + it('should not pass serviceUrl validation when body.serviceUrl is missing', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + const mockPayload = { + appid: mockClientId, + sub: 'bot-id', + serviceurl: mockServiceUrl + }; + + mockValidateAccessToken.mockResolvedValue(mockPayload); + + const authHeader = 'Bearer test-token'; + const body = {}; + + await validator.check(authHeader, body); + + expect(mockValidateAccessToken).toHaveBeenCalledWith('test-token', { + validateServiceUrl: undefined + }); + }); + + it('should use credentials for fallback appId when payload.appid is missing', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + const mockPayload = { + // appid missing + sub: 'bot-id', + serviceurl: mockServiceUrl + }; + + mockValidateAccessToken.mockResolvedValue(mockPayload); + + const authHeader = 'Bearer test-token'; + const body = { serviceUrl: mockServiceUrl }; + + const result = await validator.check(authHeader, body); + + expect(result.appId).toBe(mockClientId); + }); + + it('should prefer payload.serviceurl over body.serviceUrl', async () => { + const validator = new ServiceTokenValidator(mockClientId, mockTenantId); + + const payloadServiceUrl = 'https://payload.example.com'; + const bodyServiceUrl = 'https://body.example.com'; + + const mockPayload = { + appid: mockClientId, + sub: 'bot-id', + serviceurl: payloadServiceUrl + }; + + mockValidateAccessToken.mockResolvedValue(mockPayload); + + const authHeader = 'Bearer test-token'; + const body = { serviceUrl: bodyServiceUrl }; + + const result = await validator.check(authHeader, body); + + expect(result.serviceUrl).toBe(bodyServiceUrl); + }); + }); +}); diff --git a/packages/apps/src/middleware/auth/service-token-validator.ts b/packages/apps/src/middleware/auth/service-token-validator.ts new file mode 100644 index 000000000..b1f569df1 --- /dev/null +++ b/packages/apps/src/middleware/auth/service-token-validator.ts @@ -0,0 +1,58 @@ +import { Credentials, IToken } from '@microsoft/teams.api'; +import { ILogger } from '@microsoft/teams.common'; + +import { JwtValidator } from './jwt-validator'; + +/** + * Service token validator for Bot Framework /api/messages requests + * Validates Bot Framework service tokens + */ +export class ServiceTokenValidator { + private jwtValidator: JwtValidator; + private credentials?: Credentials; + + constructor( + appId: string, + tenantId?: string, + serviceUrl?: string, + logger?: ILogger + ) { + this.jwtValidator = new JwtValidator({ + clientId: appId, + tenantId, + validateIssuer: { allowedIssuer: 'https://api.botframework.com' }, + validateServiceUrl: serviceUrl ? { expectedServiceUrl: serviceUrl } : undefined, + jwksUriOptions: { + type: 'uri', + uri: 'https://login.botframework.com/v1/.well-known/keys' + }, + }, logger); + + this.credentials = { clientId: appId, tenantId }; + } + + async check(authHeader: string, body: any): Promise { + // Extract token from "Bearer " format + const token = authHeader.startsWith('Bearer ') + ? authHeader.substring(7) + : authHeader; + + // Validate token using JWT validator + const payload = await this.jwtValidator.validateAccessToken(token, { + validateServiceUrl: body.serviceUrl ? { expectedServiceUrl: body.serviceUrl } : undefined + }); + + if (!payload) { + throw new Error('Invalid token'); + } + + // Convert JWT payload to IToken + return { + appId: payload.appid as string || this.credentials?.clientId || '', + from: 'azure', + fromId: payload.sub as string || '', + serviceUrl: body.serviceUrl || payload.serviceurl as string || '', + isExpired: () => false, // Already validated by JWT validator + }; + } +} diff --git a/packages/apps/src/middleware/index.ts b/packages/apps/src/middleware/index.ts index eae45761b..fb5e77f59 100644 --- a/packages/apps/src/middleware/index.ts +++ b/packages/apps/src/middleware/index.ts @@ -1,4 +1,6 @@ export { createEntraTokenValidator, JwtValidator } from './auth/jwt-validator'; +export { RemoteFunctionValidator } from './auth/remote-function-validator'; +export { ServiceTokenValidator } from './auth/service-token-validator'; export * from './jwt-validation-middleware'; export * from './strip-mentions-text'; export * from './with-remote-function-jwt-validation'; diff --git a/packages/apps/src/middleware/jwt-validation-middleware.ts b/packages/apps/src/middleware/jwt-validation-middleware.ts index 100c11a1a..04e730f76 100644 --- a/packages/apps/src/middleware/jwt-validation-middleware.ts +++ b/packages/apps/src/middleware/jwt-validation-middleware.ts @@ -1,9 +1,9 @@ import express from 'express'; -import { Activity, Credentials, IToken, JsonWebToken } from '@microsoft/teams.api'; +import { Activity, Credentials, IToken } from '@microsoft/teams.api'; import { ConsoleLogger, ILogger } from '@microsoft/teams.common'; -import { createServiceTokenValidator, JwtValidator } from './auth/jwt-validator'; +import { ServiceTokenValidator } from './auth/service-token-validator'; export type JwtValidationParams = { credentials?: Credentials; @@ -19,9 +19,9 @@ export function withJwtValidation(params: JwtValidationParams) { const logger = inputLogger?.child('jwt-validation-middleware') ?? new ConsoleLogger('jwt-validation-middleware'); // Create service token validator if credentials are provided - let serviceTokenValidator: JwtValidator | null; + let validator: ServiceTokenValidator | null; if (credentials?.clientId) { - serviceTokenValidator = createServiceTokenValidator( + validator = new ServiceTokenValidator( credentials.clientId, credentials.tenantId, undefined, @@ -29,7 +29,7 @@ export function withJwtValidation(params: JwtValidationParams) { ); } else { logger.debug('No credentials provided, skipping service token validation'); - serviceTokenValidator = null; + validator = null; } return async ( @@ -37,31 +37,28 @@ export function withJwtValidation(params: JwtValidationParams) { res: express.Response, next: express.NextFunction ) => { - if (!serviceTokenValidator) { + if (!validator) { logger.debug('No service token validator configured, skipping validation'); next(); return; } - const authorization = req.headers.authorization?.replace('Bearer ', ''); - if (!authorization) { + const authHeader = req.headers.authorization; + if (!authHeader) { res.status(401).send('unauthorized'); return; } - const activity: Activity = req.body; - // Use cached validator with per-request service URL validation - const validationResult = await serviceTokenValidator.validateAccessToken(authorization, activity.serviceUrl ? { - validateServiceUrl: { expectedServiceUrl: activity.serviceUrl } - } : undefined); - if (validationResult) { + try { + const token = await validator.check(authHeader, activity); logger.debug(`validated service token for activity ${activity.id}`); // Store the validated token in the request for use in subsequent handlers - req.validatedToken = new JsonWebToken(authorization); + req.validatedToken = token; next(); - } else { + } catch (err) { + logger.error('Token validation failed:', err); res.status(401).send('Invalid token'); } }; diff --git a/packages/apps/src/middleware/with-remote-function-jwt-validation.spec.ts b/packages/apps/src/middleware/with-remote-function-jwt-validation.spec.ts index 1725552e0..15ab5ec36 100644 --- a/packages/apps/src/middleware/with-remote-function-jwt-validation.spec.ts +++ b/packages/apps/src/middleware/with-remote-function-jwt-validation.spec.ts @@ -1,5 +1,9 @@ +import { RemoteFunctionValidator } from './auth/remote-function-validator'; import { withRemoteFunctionJwtValidation } from './with-remote-function-jwt-validation'; +// Mock RemoteFunctionValidator +jest.mock('./auth/remote-function-validator'); + const mockLogger = { error: jest.fn(), info: jest.fn(), @@ -9,36 +13,43 @@ const mockLogger = { log: jest.fn(), child: jest.fn().mockReturnThis(), }; + const tokenValidatorMock = { validateAccessToken: jest.fn(), }; -const mockRequestHeaders = { - Authorization: 'Bearer valid-token', - 'X-Teams-App-Session-Id': 'test-app-session-id', - 'X-Teams-Page-Id': 'test-page-id', - 'X-Teams-Channel-Id': 'test-channel-id', - 'X-Teams-Chat-Id': 'test-chat-id', - 'X-Teams-Meeting-Id': 'test-meeting-id', - 'X-Teams-Message-Id': 'test-message-id', - 'X-Teams-Sub-Page-Id': 'test-sub-page-id', - 'X-Teams-Team-Id': 'test-team-id', -} as const; describe('withRemoteFunctionJwtValidation Middleware', () => { let mockRequest: any; let mockResponse: any; let mockNext: jest.Mock; - const mockRequestStatus = jest.fn(); - const mockRequestStatusSend = jest.fn(); + let mockValidatorCheck: jest.Mock; beforeEach(() => { + mockValidatorCheck = jest.fn(); + (RemoteFunctionValidator as unknown as jest.Mock).mockImplementation(() => ({ + check: mockValidatorCheck + })); + mockRequest = { - header: (headerName: keyof typeof mockRequestHeaders) => mockRequestHeaders[headerName], - context: {}, + headers: { + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'test-app-session-id', + 'x-teams-page-id': 'test-page-id', + 'x-teams-channel-id': 'test-channel-id', + 'x-teams-chat-id': 'test-chat-id', + 'x-teams-meeting-id': 'test-meeting-id', + 'x-teams-message-id': 'test-message-id', + 'x-teams-sub-page-id': 'test-sub-page-id', + 'x-teams-team-id': 'test-team-id', + }, + context: undefined, }; + mockResponse = { - status: mockRequestStatus.mockReturnValue({ send: mockRequestStatusSend }), + status: jest.fn().mockReturnThis(), + send: jest.fn(), }; + mockNext = jest.fn(); }); @@ -47,22 +58,7 @@ describe('withRemoteFunctionJwtValidation Middleware', () => { }); it('should set context and call next if authentication is successful', async () => { - // Mock a valid authentication scenario - tokenValidatorMock.validateAccessToken.mockResolvedValue({ - appId: 'test-app-id', - tid: 'test-tenant-id', - oid: 'test-user-id', - }); - - const handleRequest = withRemoteFunctionJwtValidation({ - logger: mockLogger, - entraTokenValidator: tokenValidatorMock, - }); - await handleRequest(mockRequest, mockResponse, mockNext); - - expect(mockNext).toHaveBeenCalled(); - expect(mockResponse.status).not.toHaveBeenCalled(); - expect(mockRequest.context).toEqual({ + const mockContext = { appId: 'test-app-id', appSessionId: 'test-app-session-id', authToken: 'valid-token', @@ -75,81 +71,130 @@ describe('withRemoteFunctionJwtValidation Middleware', () => { teamId: 'test-team-id', tenantId: 'test-tenant-id', userId: 'test-user-id', + userName: 'Test User' + }; + + mockValidatorCheck.mockResolvedValue(mockContext); + + const handleRequest = withRemoteFunctionJwtValidation({ + logger: mockLogger, + entraTokenValidator: tokenValidatorMock, + }); + + await handleRequest(mockRequest, mockResponse, mockNext); + + expect(mockValidatorCheck).toHaveBeenCalledWith({ + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'test-app-session-id', + 'x-teams-page-id': 'test-page-id', + 'x-teams-channel-id': 'test-channel-id', + 'x-teams-chat-id': 'test-chat-id', + 'x-teams-meeting-id': 'test-meeting-id', + 'x-teams-message-id': 'test-message-id', + 'x-teams-sub-page-id': 'test-sub-page-id', + 'x-teams-team-id': 'test-team-id', }); + expect(mockRequest.context).toEqual(mockContext); + expect(mockNext).toHaveBeenCalled(); + expect(mockResponse.status).not.toHaveBeenCalled(); }); - it.each` - missingHeader - ${'X-Teams-App-Session-Id'} - ${'X-Teams-Page-Id'} - `('should return 401 if the $missingHeader header is missing', async ({ missingHeader }) => { - mockRequest.header = (headerName: keyof typeof mockRequestHeaders) => - headerName === missingHeader ? undefined : mockRequestHeaders[headerName]; + it('should convert Express headers to lowercase', async () => { + mockRequest.headers = { + 'Authorization': 'Bearer valid-token', + 'X-Teams-App-Session-Id': 'test-app-session-id', + 'X-Teams-Page-Id': 'test-page-id', + }; + + mockValidatorCheck.mockResolvedValue({ + appId: 'test-app-id', + pageId: 'test-page-id', + }); const handleRequest = withRemoteFunctionJwtValidation({ logger: mockLogger, entraTokenValidator: tokenValidatorMock, }); + await handleRequest(mockRequest, mockResponse, mockNext); - expect(mockRequestStatus).toHaveBeenCalledWith(401); - expect(mockRequestStatusSend).toHaveBeenCalledWith('unauthorized'); - expect(mockNext).not.toHaveBeenCalled(); + expect(mockValidatorCheck).toHaveBeenCalledWith({ + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'test-app-session-id', + 'x-teams-page-id': 'test-page-id', + }); }); - it.each` - authorizationHeader | expected - ${undefined} | ${''} - ${'Bearer '} | ${''} - ${'Bearer invalid data '} | ${''} - ${'Bearer invalid-data '} | ${''} - ${'pop valid-token'} | ${''} - ${'Bearer valid-token'} | ${'valid-token'} - ${'BEARER valid-token'} | ${'valid-token'} - ${'bearer valid-token'} | ${'valid-token'} - `( - 'should invoke validateAccessToken with "$expected" when authorization header value is "$authorizationHeader"', - async ({ authorizationHeader, expected }) => { - mockRequest.header = (headerName: keyof typeof mockRequestHeaders) => - headerName === 'Authorization' ? authorizationHeader : mockRequestHeaders[headerName]; - - const handleRequest = withRemoteFunctionJwtValidation({ - logger: mockLogger, - entraTokenValidator: tokenValidatorMock, - }); - await handleRequest(mockRequest, mockResponse, mockNext); - expect(tokenValidatorMock.validateAccessToken).toHaveBeenCalledWith(expected); - } - ); + it('should skip non-string header values', async () => { + mockRequest.headers = { + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'test-app-session-id', + 'x-teams-page-id': 'test-page-id', + 'x-forwarded-for': ['1.2.3.4', '5.6.7.8'], // array value - should be skipped + }; + + mockValidatorCheck.mockResolvedValue({ + appId: 'test-app-id', + pageId: 'test-page-id', + }); + + const handleRequest = withRemoteFunctionJwtValidation({ + logger: mockLogger, + entraTokenValidator: tokenValidatorMock, + }); + + await handleRequest(mockRequest, mockResponse, mockNext); + + expect(mockValidatorCheck).toHaveBeenCalledWith({ + 'authorization': 'Bearer valid-token', + 'x-teams-app-session-id': 'test-app-session-id', + 'x-teams-page-id': 'test-page-id', + // x-forwarded-for should not be included + }); + }); it('should return 401 if the token validator is missing', async () => { const handleRequest = withRemoteFunctionJwtValidation({ logger: mockLogger, entraTokenValidator: undefined, }); + await handleRequest(mockRequest, mockResponse, mockNext); - expect(mockRequestStatus).toHaveBeenCalledWith(401); - expect(mockRequestStatusSend).toHaveBeenCalledWith('unauthorized'); + expect(mockLogger.debug).toHaveBeenCalledWith('unauthorized - no token validator configured'); + expect(mockResponse.status).toHaveBeenCalledWith(401); + expect(mockResponse.send).toHaveBeenCalledWith('unauthorized'); expect(mockNext).not.toHaveBeenCalled(); }); it('should return 401 if token validation fails', async () => { + mockValidatorCheck.mockResolvedValue(null); + const handleRequest = withRemoteFunctionJwtValidation({ logger: mockLogger, entraTokenValidator: tokenValidatorMock, }); - tokenValidatorMock.validateAccessToken.mockResolvedValue(null); - await handleRequest(mockRequest, mockResponse, mockNext); - expect(mockLogger.debug).toHaveBeenCalledWith('unauthorized'); - const send = jest.fn(); - const response: any = { - status: jest.fn().mockReturnValue({ send }), - }; - await handleRequest(mockRequest, response, mockNext); + expect(mockResponse.status).toHaveBeenCalledWith(401); + expect(mockResponse.send).toHaveBeenCalledWith('unauthorized'); expect(mockNext).not.toHaveBeenCalled(); }); + + it('should create RemoteFunctionValidator with correct params', async () => { + mockValidatorCheck.mockResolvedValue({ + appId: 'test-app-id', + pageId: 'test-page-id', + }); + + const handleRequest = withRemoteFunctionJwtValidation({ + logger: mockLogger, + entraTokenValidator: tokenValidatorMock, + }); + + await handleRequest(mockRequest, mockResponse, mockNext); + + expect(RemoteFunctionValidator).toHaveBeenCalledWith(tokenValidatorMock, mockLogger); + }); }); diff --git a/packages/apps/src/middleware/with-remote-function-jwt-validation.ts b/packages/apps/src/middleware/with-remote-function-jwt-validation.ts index 8d110818c..519b2b548 100644 --- a/packages/apps/src/middleware/with-remote-function-jwt-validation.ts +++ b/packages/apps/src/middleware/with-remote-function-jwt-validation.ts @@ -6,6 +6,7 @@ import { ILogger } from '@microsoft/teams.common'; import { IClientContext } from '../contexts'; import { JwtValidator } from './auth/jwt-validator'; +import { RemoteFunctionValidator } from './auth/remote-function-validator'; export type WithRemoteFunctionJwtValidationParams = Partial & { entraTokenValidator?: Pick; @@ -25,50 +26,38 @@ export function withRemoteFunctionJwtValidation( const entraTokenValidator = params.entraTokenValidator; const log = params.logger; + // Create the validator once + const validator = entraTokenValidator + ? new RemoteFunctionValidator(entraTokenValidator, log) + : null; + return async ( req: JwtRemoteFunctionRequest, res: express.Response, next: express.NextFunction ) => { - const appSessionId = req.header('X-Teams-App-Session-Id'); - const pageId = req.header('X-Teams-Page-Id'); - const authorization = req.header('Authorization')?.split(' '); - const authToken = - authorization?.length === 2 && authorization[0].toLowerCase() === 'bearer' - ? authorization[1] - : ''; - - const tokenPayload = !entraTokenValidator - ? null - : await entraTokenValidator.validateAccessToken(authToken); - if ( - !pageId || - !appSessionId || - !authToken || - !entraTokenValidator || - !tokenPayload - ) { - log.debug('unauthorized'); + if (!validator) { + log.debug('unauthorized - no token validator configured'); res.status(401).send('unauthorized'); return; } - req.context = { - appId: tokenPayload?.['appId'], - appSessionId, - authToken, - channelId: req.header('X-Teams-Channel-Id'), - chatId: req.header('X-Teams-Chat-Id'), - meetingId: req.header('X-Teams-Meeting-Id'), - messageId: req.header('X-Teams-Message-Id'), - pageId, - subPageId: req.header('X-Teams-Sub-Page-Id'), - teamId: req.header('X-Teams-Team-Id'), - tenantId: tokenPayload['tid'], - userId: tokenPayload['oid'], - userName: tokenPayload['name'], - }; + // Convert Express headers to plain object + const headers: Record = {}; + Object.keys(req.headers).forEach(key => { + const value = req.headers[key]; + if (typeof value === 'string') { + headers[key.toLowerCase()] = value; + } + }); + + const context = await validator.check(headers); + if (!context) { + res.status(401).send('unauthorized'); + return; + } + req.context = context; next(); }; } From fec351f378c5b8acc89695a299df80121d9e0957 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 07:46:48 -0800 Subject: [PATCH 24/33] package-lock.json --- package-lock.json | 305 ---------------------------------------------- 1 file changed, 305 deletions(-) diff --git a/package-lock.json b/package-lock.json index 872520a4f..e51f2ff1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,33 +43,6 @@ "typescript": "^5.4.5" } }, - "examples/adapters": { - "name": "@examples/adapters", - "version": "0.0.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.apps": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "cors": "^2.8.5", - "express": "^4.21.0", - "hono": "^4.6.14", - "next": "^14.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/cors": "^2.8.17", - "@types/express": "^5.0.0", - "@types/node": "^22.5.4", - "@types/react": "^18.2.0", - "dotenv": "^16.4.5", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, "examples/ai": { "name": "@examples/ai", "version": "0.0.6", @@ -175,28 +148,6 @@ "typescript": "^5.4.5" } }, - "examples/express-adapter": { - "name": "@examples/express-adapter", - "version": "0.0.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.apps": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "cors": "^2.8.5", - "express": "^4.21.0" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/cors": "^2.8.17", - "@types/express": "^5.0.0", - "@types/node": "^22.5.4", - "dotenv": "^16.4.5", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, "examples/graph": { "name": "@examples/auth", "version": "0.0.6", @@ -359,28 +310,6 @@ "typescript": "^5.4.5" } }, - "examples/nextjs": { - "name": "@examples/nextjs", - "version": "0.0.1", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@microsoft/teams.api": "2.0.5", - "@microsoft/teams.apps": "2.0.5", - "@microsoft/teams.common": "2.0.5", - "next": "^14.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@microsoft/teams.config": "2.0.5", - "@types/node": "^22.5.4", - "@types/react": "^18.2.0", - "dotenv": "^16.4.5", - "tsx": "^4.20.6", - "typescript": "^5.4.5" - } - }, "examples/tab": { "name": "@examples/tab", "version": "0.0.6", @@ -1352,8 +1281,6 @@ }, "node_modules/@changesets/apply-release-plan": { "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.14.tgz", - "integrity": "sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==", "dev": true, "license": "MIT", "dependencies": { @@ -1374,8 +1301,6 @@ }, "node_modules/@changesets/apply-release-plan/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", "bin": { @@ -1390,8 +1315,6 @@ }, "node_modules/@changesets/assemble-release-plan": { "version": "6.0.9", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.9.tgz", - "integrity": "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1453,8 +1376,6 @@ }, "node_modules/@changesets/config": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.1.2.tgz", - "integrity": "sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==", "dev": true, "license": "MIT", "dependencies": { @@ -1469,8 +1390,6 @@ }, "node_modules/@changesets/errors": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", "dev": true, "license": "MIT", "dependencies": { @@ -1479,8 +1398,6 @@ }, "node_modules/@changesets/get-dependents-graph": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.3.tgz", - "integrity": "sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1492,8 +1409,6 @@ }, "node_modules/@changesets/get-release-plan": { "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.14.tgz", - "integrity": "sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==", "dev": true, "license": "MIT", "dependencies": { @@ -1507,15 +1422,11 @@ }, "node_modules/@changesets/get-version-range-type": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", "dev": true, "license": "MIT" }, "node_modules/@changesets/git": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.4.tgz", - "integrity": "sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -1528,8 +1439,6 @@ }, "node_modules/@changesets/logger": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", "dev": true, "license": "MIT", "dependencies": { @@ -1538,8 +1447,6 @@ }, "node_modules/@changesets/parse": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.2.tgz", - "integrity": "sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==", "dev": true, "license": "MIT", "dependencies": { @@ -1549,15 +1456,11 @@ }, "node_modules/@changesets/parse/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/@changesets/parse/node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -1569,8 +1472,6 @@ }, "node_modules/@changesets/pre": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.2.tgz", - "integrity": "sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==", "dev": true, "license": "MIT", "dependencies": { @@ -1582,8 +1483,6 @@ }, "node_modules/@changesets/read": { "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.6.tgz", - "integrity": "sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==", "dev": true, "license": "MIT", "dependencies": { @@ -1598,8 +1497,6 @@ }, "node_modules/@changesets/should-skip-package": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.2.tgz", - "integrity": "sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==", "dev": true, "license": "MIT", "dependencies": { @@ -3471,8 +3368,6 @@ }, "node_modules/@hono/node-server": { "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", "license": "MIT", "engines": { "node": ">=18.14.1" @@ -4058,8 +3953,6 @@ }, "node_modules/@manypkg/find-root": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", "dev": true, "license": "MIT", "dependencies": { @@ -4071,15 +3964,11 @@ }, "node_modules/@manypkg/find-root/node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true, "license": "MIT" }, "node_modules/@manypkg/find-root/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -4093,8 +3982,6 @@ }, "node_modules/@manypkg/get-packages": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", "dev": true, "license": "MIT", "dependencies": { @@ -4108,15 +3995,11 @@ }, "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", "dev": true, "license": "MIT" }, "node_modules/@manypkg/get-packages/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -4913,14 +4796,10 @@ }, "node_modules/@next/env": { "version": "14.2.35", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", - "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", - "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", "cpu": [ "arm64" ], @@ -4933,134 +4812,6 @@ "node": ">= 10" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", - "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", - "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", - "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", - "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", - "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", - "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", - "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", - "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@noble/hashes": { "version": "1.8.0", "dev": true, @@ -6083,8 +5834,6 @@ }, "node_modules/@swc/counter": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "license": "Apache-2.0" }, "node_modules/@swc/helpers": { @@ -7455,8 +7204,6 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -7772,8 +7519,6 @@ }, "node_modules/better-path-resolve": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", "dev": true, "license": "MIT", "dependencies": { @@ -8353,8 +8098,6 @@ }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -8640,8 +8383,6 @@ }, "node_modules/client-only": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, "node_modules/cliui": { @@ -9393,8 +9134,6 @@ }, "node_modules/detect-indent": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "license": "MIT", "engines": { @@ -9465,8 +9204,6 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -9699,8 +9436,6 @@ }, "node_modules/env-cmd/node_modules/@commander-js/extra-typings": { "version": "13.1.0", - "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-13.1.0.tgz", - "integrity": "sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -9709,8 +9444,6 @@ }, "node_modules/env-cmd/node_modules/commander": { "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { @@ -10517,8 +10250,6 @@ }, "node_modules/extendable-error": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", "dev": true, "license": "MIT" }, @@ -11192,8 +10923,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -12175,8 +11904,6 @@ }, "node_modules/is-subdir": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", "dev": true, "license": "MIT", "dependencies": { @@ -12273,8 +12000,6 @@ }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { @@ -13346,8 +13071,6 @@ }, "node_modules/lodash.startcase": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true, "license": "MIT" }, @@ -14538,8 +14261,6 @@ }, "node_modules/next": { "version": "14.2.35", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", - "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "license": "MIT", "dependencies": { "@next/env": "14.2.35", @@ -14588,8 +14309,6 @@ }, "node_modules/next/node_modules/@swc/helpers": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", @@ -14598,8 +14317,6 @@ }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -15199,8 +14916,6 @@ }, "node_modules/outdent": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", "dev": true, "license": "MIT" }, @@ -15222,8 +14937,6 @@ }, "node_modules/p-filter": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", "dev": true, "license": "MIT", "dependencies": { @@ -15235,8 +14948,6 @@ }, "node_modules/p-filter/node_modules/p-map": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, "license": "MIT", "engines": { @@ -15473,8 +15184,6 @@ }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { @@ -15538,8 +15247,6 @@ }, "node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { @@ -16298,8 +16005,6 @@ }, "node_modules/read-yaml-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", "dev": true, "license": "MIT", "dependencies": { @@ -16314,8 +16019,6 @@ }, "node_modules/read-yaml-file/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -17339,8 +17042,6 @@ }, "node_modules/spawndamnit": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { @@ -17350,8 +17051,6 @@ }, "node_modules/spawndamnit/node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -17449,8 +17148,6 @@ }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } @@ -17672,8 +17369,6 @@ }, "node_modules/styled-jsx": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", "license": "MIT", "dependencies": { "client-only": "0.0.1" From 0f2c0df5fd820a616b1a76de1eea29f1668f723c Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 08:22:03 -0800 Subject: [PATCH 25/33] nextjs -> fastify --- examples/http-adapters/README.md | 8 +- examples/http-adapters/express/README.md | 50 -- .../http-adapters/fastify/fastify-adapter.ts | 97 +++ examples/http-adapters/fastify/index.ts | 28 + examples/http-adapters/fastify/teams-app.ts | 48 ++ examples/http-adapters/hono/README.md | 49 -- examples/http-adapters/nextjs/README.md | 72 -- examples/http-adapters/nextjs/app/layout.tsx | 18 - examples/http-adapters/nextjs/app/page.tsx | 29 - .../http-adapters/nextjs/app/test/page.tsx | 8 - examples/http-adapters/nextjs/next-env.d.ts | 5 - examples/http-adapters/nextjs/next.config.js | 7 - .../http-adapters/nextjs/nextjs-adapter.ts | 139 ---- examples/http-adapters/nextjs/server.ts | 21 - examples/http-adapters/nextjs/teams-app.ts | 21 - examples/http-adapters/nextjs/tsconfig.json | 34 - examples/http-adapters/package.json | 12 +- package-lock.json | 629 +++++++++++++----- .../api/src/clients/conversation/activity.ts | 9 + 19 files changed, 667 insertions(+), 617 deletions(-) delete mode 100644 examples/http-adapters/express/README.md create mode 100644 examples/http-adapters/fastify/fastify-adapter.ts create mode 100644 examples/http-adapters/fastify/index.ts create mode 100644 examples/http-adapters/fastify/teams-app.ts delete mode 100644 examples/http-adapters/hono/README.md delete mode 100644 examples/http-adapters/nextjs/README.md delete mode 100644 examples/http-adapters/nextjs/app/layout.tsx delete mode 100644 examples/http-adapters/nextjs/app/page.tsx delete mode 100644 examples/http-adapters/nextjs/app/test/page.tsx delete mode 100644 examples/http-adapters/nextjs/next-env.d.ts delete mode 100644 examples/http-adapters/nextjs/next.config.js delete mode 100644 examples/http-adapters/nextjs/nextjs-adapter.ts delete mode 100644 examples/http-adapters/nextjs/server.ts delete mode 100644 examples/http-adapters/nextjs/teams-app.ts delete mode 100644 examples/http-adapters/nextjs/tsconfig.json diff --git a/examples/http-adapters/README.md b/examples/http-adapters/README.md index 14861e38b..d15f5c330 100644 --- a/examples/http-adapters/README.md +++ b/examples/http-adapters/README.md @@ -8,9 +8,9 @@ An adapter bridges your HTTP framework with teams.ts. You create your server, pa ## Examples -- **[express/](./express/)** - Hook teams.ts into an existing Express server -- **[hono/](./hono/)** - Build a custom adapter (Hono example) -- **[nextjs/](./nextjs/)** - Integrate with Next.js app +- **[express/](./express/)** - Hook your own Express server with the built-in Express adapter +- **[hono/](./hono/)** - Build a custom adapter and manage the lifecycle yourself +- **[fastify/](./fastify/)** - Build a custom adapter and let App manage its lifecycle ## Running @@ -21,7 +21,7 @@ cp .env.example .env # Run an example npm run dev:express npm run dev:hono -npm run dev:nextjs +npm run dev:fastify ``` All examples start on `http://localhost:3978` with `/api/messages` as the bot endpoint. diff --git a/examples/http-adapters/express/README.md b/examples/http-adapters/express/README.md deleted file mode 100644 index 917e1d10f..000000000 --- a/examples/http-adapters/express/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Express + teams.ts Example - -This example shows how to integrate teams.ts into your **existing Express server**. - -## Key Concept - -**You manage the server lifecycle**, not the App. The App simply registers the `/api/messages` endpoint on your existing Express server. - -## How It Works - -```typescript -// 1. Create your Express app and server (you own this) -const expressApp = express(); -const httpServer = http.createServer(expressApp); - -// Add your custom routes -expressApp.get('/health', (req, res) => { - res.json({ status: 'ok' }); -}); - -// 2. Pass your server to ExpressAdapter -const adapter = new ExpressAdapter(httpServer); - -// 3. Create App with the adapter -const app = new App({ - httpAdapter: adapter -}); - -// 4. Initialize (adds /api/messages to your Express app) -await app.initialize(); - -// 5. You control the server lifecycle -httpServer.listen(3978); -``` - -## Running - -```bash -npm run dev -``` - -Server starts on `http://localhost:3978` with: -- Your custom Express routes -- `/api/messages` - Teams bot endpoint (added by teams.ts) - -## Why This Pattern? - -- ✅ Hook teams.ts into your existing Express server -- ✅ You control server startup/shutdown -- ✅ Add Teams bot capabilities to any Express app diff --git a/examples/http-adapters/fastify/fastify-adapter.ts b/examples/http-adapters/fastify/fastify-adapter.ts new file mode 100644 index 000000000..7ca779977 --- /dev/null +++ b/examples/http-adapters/fastify/fastify-adapter.ts @@ -0,0 +1,97 @@ +import fastify, { FastifyInstance } from 'fastify'; +import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adapter'; + +/** + * Fastify adapter for HttpServer + * + * Handles Fastify-specific HTTP framework concerns: + * - Fastify app creation and initialization + * - Route registration via Fastify routing + * - Request/response data extraction and sending + * - Server lifecycle management + * + * Usage: + * const adapter = new FastifyAdapter(); + * const app = new App({ httpAdapter: adapter }); + * await app.initialize(); + * await app.start(3978); + */ +export class FastifyAdapter implements IHttpAdapter { + protected fastify: FastifyInstance; + protected isUserProvidedInstance: boolean; + + constructor(instance?: FastifyInstance) { + this.isUserProvidedInstance = !!instance; + this.fastify = instance || fastify({ logger: true }); + } + + /** + * Get the Fastify instance for adding custom routes/plugins + */ + get instance(): FastifyInstance { + return this.fastify; + } + + /** + * Register a route with Fastify + */ + registerRouteHandler(config: IRouteConfig): void { + const { method, path, handler } = config; + + // Register with Fastify + this.fastify.route({ + method: method.toUpperCase() as any, + url: path, + handler: async (request, reply) => { + try { + // Provide helpers to the handler + await handler({ + extractRequestData: () => ({ + body: request.body as any, + headers: request.headers as Record + }), + sendResponse: (response) => { + reply.status(response.status).send(response.body); + } + }); + } catch (err) { + reply.status(500).send({ error: 'Internal server error' }); + } + } + }); + } + + /** + * Initialize the adapter + * No initialization needed - Fastify will call ready() automatically when listen() is called + */ + async initialize(): Promise { + // No initialization needed for Fastify + // Routes must be registered before calling listen() + // Fastify will automatically call ready() when listen() is invoked + } + + /** + * Start the server + * Throws if instance was user-provided + */ + async start(port: number): Promise { + if (this.isUserProvidedInstance) { + throw new Error( + 'Cannot call start() when Fastify instance was provided by user. ' + + 'User should call fastify.listen() directly.' + ); + } + + await this.fastify.listen({ port, }); + } + + /** + * Stop the server + */ + async stop(): Promise { + if (!this.isUserProvidedInstance) { + await this.fastify.close(); + } + } +} diff --git a/examples/http-adapters/fastify/index.ts b/examples/http-adapters/fastify/index.ts new file mode 100644 index 000000000..e64cfc719 --- /dev/null +++ b/examples/http-adapters/fastify/index.ts @@ -0,0 +1,28 @@ +import 'dotenv/config'; +import { app } from './teams-app'; + +const port = parseInt(process.env.PORT || '3978', 10); + +async function main() { + console.log('Starting Fastify server with Teams bot integration...\n'); + + // In this case, we're choosing to use a Fastify server to run the app + // app.start() will initialize the app and start the Fastify server + // + // Alternatively, we could have used app.initialize() and then started + // the Fastify server separately with adapter.instance.listen() + await app.start(port); + + console.log(`✓ Server ready on http://localhost:${port}`); + console.log(`\nYour Fastify routes:`); + console.log(` GET / - Homepage`); + console.log(` GET /health - Health check`); + console.log(` GET /api/users - Users API`); + console.log(` POST /api/messages - Teams bot endpoint (added by teams.ts)`); + console.log(`\nOpen http://localhost:${port} in your browser!`); +} + +main().catch((err) => { + console.error('Failed to start:', err); + process.exit(1); +}); diff --git a/examples/http-adapters/fastify/teams-app.ts b/examples/http-adapters/fastify/teams-app.ts new file mode 100644 index 000000000..4137eaeab --- /dev/null +++ b/examples/http-adapters/fastify/teams-app.ts @@ -0,0 +1,48 @@ +import { App } from '@microsoft/teams.apps'; +import { FastifyAdapter } from './fastify-adapter'; + +// 1. Create Fastify adapter +export const adapter = new FastifyAdapter(); + +// Get the Fastify instance to add custom routes +const fastify = adapter.instance; + +// 2. Add your custom routes +fastify.get('/health', async (_request, reply) => { + return reply.send({ status: 'healthy', timestamp: new Date().toISOString() }); +}); + +fastify.get('/api/users', async (_request, reply) => { + return reply.send({ + users: [ + { id: 1, name: 'Alice' }, + { id: 2, name: 'Bob' } + ] + }); +}); + +fastify.get('/', async (_request, reply) => { + return reply.type('text/html').send(` + + +

Fastify + teams.ts

+

Your Fastify server is running with a Teams bot!

+ + + + `); +}); + +// 3. Create teams.ts app with the adapter +export const app = new App({ + httpAdapter: adapter, +}); + +// 4. Handle incoming messages +app.on('message', async ({ send, activity }) => { + await send(`Echo from Fastify server: ${activity.text}`); +}); diff --git a/examples/http-adapters/hono/README.md b/examples/http-adapters/hono/README.md deleted file mode 100644 index 34b13962e..000000000 --- a/examples/http-adapters/hono/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Hono + teams.ts Example - -This example shows how to build a custom HTTP adapter and integrate teams.ts with any framework. - -## Key Concepts - -**1. Building a custom adapter** - See `hono-adapter.ts` for a minimal `IHttpAdapter` implementation (~60 lines). - -**2. Lifecycle options** - Two approaches: -- Implement `start()` in your adapter, then call `app.start()` -- Call `app.initialize()` and manage the server yourself ← This example - -## How It Works - -```typescript -// Create Hono app with your routes -const hono = new Hono(); -hono.get('/health', (c) => c.json({ status: 'ok' })); - -// Create adapter and App -const adapter = new HonoAdapter(hono); -const app = new App({ httpAdapter: adapter }); -app.on('message', async ({ send, activity }) => { - await send(`Echo: ${activity.text}`); -}); - -// Initialize adds /api/messages to your Hono app -await app.initialize(); - -// You control the server lifecycle -serve({ fetch: hono.fetch, port: 3978 }); -``` - -## Running - -```bash -npm run dev:hono -``` - -Server starts on `http://localhost:3978` with: -- Your custom Hono routes -- `/api/messages` - Teams bot endpoint - -## Why This Pattern? - -- ✅ Use any HTTP framework -- ✅ Full control over server lifecycle -- ✅ Simple adapter implementation -- ✅ Add Teams bot to existing apps diff --git a/examples/http-adapters/nextjs/README.md b/examples/http-adapters/nextjs/README.md deleted file mode 100644 index 4f4d61bfc..000000000 --- a/examples/http-adapters/nextjs/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# Next.js + teams.ts Example - -This example demonstrates how to use **Next.js** with teams.ts using a custom `NextjsAdapter`. - -> **Note**: The `NextjsAdapter` is included in this example (`src/nextjs-adapter.ts`) and is not part of the core `@microsoft/teams.apps` package. You can copy and customize it for your own projects. - -## Architecture - -- **Next.js** - React framework with server-side rendering -- **NextjsAdapter** (local) - Intercepts Teams routes before Next.js -- **ConfigurableHttpPlugin** - Generic HTTP plugin that works with any adapter - -## Getting Started - -1. Install dependencies: -```bash -npm install -``` - -2. Copy `.env.example` to `.env` and configure: -```bash -cp .env.example .env -``` - -3. Run the development server: -```bash -npm run dev -``` - -The server will start on `http://localhost:3978` with: -- `/api/messages` - Teams bot endpoint (handled by NextjsAdapter) -- All other routes - Handled by Next.js - -## How It Works - -```typescript -import { App } from '@microsoft/teams.apps'; -import { NextjsAdapter } from './nextjs-adapter'; - -// Create adapter and app -const adapter = new NextjsAdapter(undefined, { - dev: process.env.NODE_ENV !== 'production' -}); - -const app = new App({ - httpAdapter: adapter -}); - -// Start the app -await app.start(3978); -``` - -The `NextjsAdapter` handles: -- Creating and managing the Next.js app -- Preparing Next.js (await nextApp.prepare()) -- Intercepting `/api/messages` before Next.js sees it -- Falling back to Next.js for all other routes -- Server lifecycle management - -## Key Features - -- **Route Interception** - Teams bot routes are handled before Next.js -- **Seamless Fallback** - All non-bot routes go to Next.js -- **Manual Server Management** - Full control over server lifecycle -- **TypeScript** - Full type safety - -## Benefits - -- ✅ **Co-located** - Bot and web UI in the same app -- ✅ **No conflicts** - Clean separation of concerns -- ✅ **Simple** - No complex routing logic needed -- ✅ **Flexible** - Easy to customize the adapter diff --git a/examples/http-adapters/nextjs/app/layout.tsx b/examples/http-adapters/nextjs/app/layout.tsx deleted file mode 100644 index a845cccca..000000000 --- a/examples/http-adapters/nextjs/app/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { Metadata } from 'next'; - -export const metadata: Metadata = { - title: 'Next.js + teams.ts', - description: 'A Next.js app integrated with teams.ts SDK', -}; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - {children} - - ); -} diff --git a/examples/http-adapters/nextjs/app/page.tsx b/examples/http-adapters/nextjs/app/page.tsx deleted file mode 100644 index b46056b17..000000000 --- a/examples/http-adapters/nextjs/app/page.tsx +++ /dev/null @@ -1,29 +0,0 @@ -export default function Home() { - return ( -
-

Next.js + teams.ts Integration

-

- This is a Next.js app that integrates the teams.ts SDK using a shared HTTP server. -

-
    -
  • - Teams Bot Endpoint: POST /api/messages -
  • -
  • - Bot Manifest: GET / (root) -
  • -
  • - This Page: Served by Next.js routing -
  • -
-

How it works:

-
    -
  1. A single HTTP server is created and shared between Next.js and teams.ts
  2. -
  3. Both frameworks register request handlers via server.on('request', handler)
  4. -
  5. teams.ts HttpPlugin sets up Express routes (like /api/messages)
  6. -
  7. Next.js handles its own routes (like this page)
  8. -
  9. We call app.initialize() instead of app.start() to avoid conflicting server.listen() calls
  10. -
-
- ); -} diff --git a/examples/http-adapters/nextjs/app/test/page.tsx b/examples/http-adapters/nextjs/app/test/page.tsx deleted file mode 100644 index 069b0549e..000000000 --- a/examples/http-adapters/nextjs/app/test/page.tsx +++ /dev/null @@ -1,8 +0,0 @@ -export default function TestPage() { - return ( -
-

Test Page

-

If you can see this, Next.js routing is working!

-
- ); -} diff --git a/examples/http-adapters/nextjs/next-env.d.ts b/examples/http-adapters/nextjs/next-env.d.ts deleted file mode 100644 index 40c3d6809..000000000 --- a/examples/http-adapters/nextjs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/examples/http-adapters/nextjs/next.config.js b/examples/http-adapters/nextjs/next.config.js deleted file mode 100644 index 646be66a6..000000000 --- a/examples/http-adapters/nextjs/next.config.js +++ /dev/null @@ -1,7 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - // Disable default server since we're using a custom server - // This is implicit when using custom server, but good to be explicit -}; - -module.exports = nextConfig; diff --git a/examples/http-adapters/nextjs/nextjs-adapter.ts b/examples/http-adapters/nextjs/nextjs-adapter.ts deleted file mode 100644 index 247bcc1b4..000000000 --- a/examples/http-adapters/nextjs/nextjs-adapter.ts +++ /dev/null @@ -1,139 +0,0 @@ -import http from 'http'; -import next from 'next'; -import { IHttpAdapter, IRouteConfig } from '@microsoft/teams.apps/dist/http/adapter'; - -/** - * Next.js adapter for HttpServer - * - * Handles Next.js-specific concerns: - * - Next.js app preparation and initialization - * - Route interception for Teams bot endpoints - * - Fallback to Next.js handler for all other routes - * - * Usage: - * const server = http.createServer(); - * const adapter = new NextjsAdapter(server); - * const app = new App({ httpAdapter: adapter }); - * await app.initialize(); - * server.listen(3978); - */ -export class NextjsAdapter implements IHttpAdapter { - protected nextApp: ReturnType; - protected server: http.Server; - protected routes: Map = new Map(); - protected dev: boolean; - protected requestHandlerAttached: boolean = false; - - constructor(server: http.Server, options?: { dev?: boolean; dir?: string }) { - this.server = server; - this.dev = options?.dev ?? process.env.NODE_ENV !== 'production'; - - // Create Next.js app - this.nextApp = next({ - dev: this.dev, - dir: options?.dir - }); - } - - /** - * Register a POST route handler with the adapter - * Routes are stored and handled before Next.js gets the request - * All routes are POST-only (Teams bot protocol uses POST) - */ - registerRouteHandler(config: IRouteConfig): void { - const key = `POST:${config.path}`; - this.routes.set(key, config); - } - - /** - * Serve static files from a directory - * Note: Next.js handles static files in public/ directory automatically - * This is for serving additional static directories - */ - serveStatic(_path: string, _directory: string): void { - // Next.js handles static files automatically via public/ directory - // For custom static file serving, users should use Next.js's built-in mechanisms - // This method is a no-op for Next.js adapter - throw new Error( - 'serveStatic() is not supported in Next.js adapter. ' + - 'Use Next.js built-in static file serving (public/ directory) instead.' - ); - } - - /** - * Initialize Next.js - prepare the Next.js app - */ - async initialize(): Promise { - await this.nextApp.prepare(); - - // Only attach the request handler once - if (this.requestHandlerAttached) { - return; - } - - // Create request handler that checks our routes first, then falls back to Next.js - const nextHandler = this.nextApp.getRequestHandler(); - const requestHandler = async (req: http.IncomingMessage, res: http.ServerResponse) => { - const method = req.method?.toUpperCase() || 'GET'; - const url = req.url || '/'; - const path = url.split('?')[0]; // Remove query string - - // Check if we have a registered route for this path - const key = `${method}:${path}`; - const route = this.routes.get(key); - - if (route) { - // Handle with our route handler - try { - // Parse body for POST/PUT/PATCH requests - let body: any = {}; - if (['POST', 'PUT', 'PATCH'].includes(method)) { - body = await this.parseBody(req); - } - - const headers = req.headers as Record; - - await route.handler({ - extractRequestData: () => ({ body, headers }), - sendResponse: (response) => { - res.statusCode = response.status; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify(response.body)); - } - }); - } catch (err) { - console.error('Route handler error:', err); - res.statusCode = 500; - res.end(JSON.stringify({ error: 'Internal server error' })); - } - } else { - // Let Next.js handle it - await nextHandler(req, res); - } - }; - - // Attach request handler to the server - this.server.on('request', requestHandler); - this.requestHandlerAttached = true; - } - - /** - * Parse request body - */ - private async parseBody(req: http.IncomingMessage): Promise { - return new Promise((resolve, reject) => { - let data = ''; - req.on('data', (chunk) => { - data += chunk.toString(); - }); - req.on('end', () => { - try { - resolve(data ? JSON.parse(data) : {}); - } catch (err) { - reject(err); - } - }); - req.on('error', reject); - }); - } -} diff --git a/examples/http-adapters/nextjs/server.ts b/examples/http-adapters/nextjs/server.ts deleted file mode 100644 index 480545099..000000000 --- a/examples/http-adapters/nextjs/server.ts +++ /dev/null @@ -1,21 +0,0 @@ -import 'dotenv/config'; -import { app, httpServer } from './teams-app'; - -const port = parseInt(process.env.PORT || '3978', 10); - -async function main() { - // Initialize the app (registers routes with adapter) - await app.initialize(); - - // Start your server (you control the lifecycle) - httpServer.listen(port, () => { - console.log(`> Server ready on http://localhost:${port}`); - console.log(`> Teams bot endpoint: /api/messages`); - console.log(`> Next.js pages are served alongside Teams bot routes`); - }); -} - -main().catch((err) => { - console.error('Failed to start:', err); - process.exit(1); -}); diff --git a/examples/http-adapters/nextjs/teams-app.ts b/examples/http-adapters/nextjs/teams-app.ts deleted file mode 100644 index bed9b70cc..000000000 --- a/examples/http-adapters/nextjs/teams-app.ts +++ /dev/null @@ -1,21 +0,0 @@ -import http from 'http'; -import { App } from '@microsoft/teams.apps'; -import { NextjsAdapter } from './nextjs-adapter'; - -// 1. Create HTTP server (you own this) -export const httpServer = http.createServer(); - -// 2. Create Next.js adapter with your server -export const adapter = new NextjsAdapter(httpServer, { - dev: process.env.NODE_ENV !== 'production' -}); - -// 3. Create teams.ts app with the adapter -export const app = new App({ - httpAdapter: adapter -}); - -// 4. Handle incoming messages -app.on('message', async ({ send, activity }) => { - await send(`Echo from Next.js + teams.ts: ${activity.text}`); -}); diff --git a/examples/http-adapters/nextjs/tsconfig.json b/examples/http-adapters/nextjs/tsconfig.json deleted file mode 100644 index ccb2ed95d..000000000 --- a/examples/http-adapters/nextjs/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "noEmit": true, - "incremental": true, - "module": "esnext", - "esModuleInterop": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "plugins": [ - { - "name": "next" - } - ] - }, - "include": [ - "next-env.d.ts", - ".next/types/**/*.ts", - "**/*.ts", - "**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/examples/http-adapters/package.json b/examples/http-adapters/package.json index 6e937036f..448e9d9a2 100644 --- a/examples/http-adapters/package.json +++ b/examples/http-adapters/package.json @@ -6,11 +6,10 @@ "scripts": { "dev:express": "tsx watch express/index.ts", "dev:hono": "tsx watch hono/index.ts", - "dev:nextjs": "tsx watch nextjs/server.ts", + "dev:fastify": "tsx watch fastify/index.ts", "start:express": "NODE_ENV=production tsx express/index.ts", "start:hono": "NODE_ENV=production tsx hono/index.ts", - "start:nextjs": "NODE_ENV=production tsx nextjs/server.ts", - "build:nextjs": "next build" + "start:fastify": "NODE_ENV=production tsx fastify/index.ts" }, "dependencies": { "@hono/node-server": "^1.19.9", @@ -19,17 +18,14 @@ "@microsoft/teams.common": "2.0.5", "cors": "^2.8.5", "express": "^4.21.0", - "hono": "^4.6.14", - "next": "^14.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "fastify": "^5.2.0", + "hono": "^4.6.14" }, "devDependencies": { "@microsoft/teams.config": "2.0.5", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/node": "^22.5.4", - "@types/react": "^18.2.0", "dotenv": "^16.4.5", "tsx": "^4.20.6", "typescript": "^5.4.5" diff --git a/package-lock.json b/package-lock.json index e51f2ff1c..6edb6017a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -182,17 +182,14 @@ "@microsoft/teams.common": "2.0.5", "cors": "^2.8.5", "express": "^4.21.0", - "hono": "^4.6.14", - "next": "^14.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "fastify": "^5.2.0", + "hono": "^4.6.14" }, "devDependencies": { "@microsoft/teams.config": "2.0.5", "@types/cors": "^2.8.17", "@types/express": "^5.0.0", "@types/node": "^22.5.4", - "@types/react": "^18.2.0", "dotenv": "^16.4.5", "tsx": "^4.20.6", "typescript": "^5.4.5" @@ -1920,6 +1917,126 @@ "resolved": "examples/tab", "link": true }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" + } + }, + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^6.0.0" + } + }, + "node_modules/@fastify/forwarded": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", + "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", + "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@fastify/proxy-addr/node_modules/ipaddr.js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", + "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@floating-ui/core": { "version": "1.7.3", "license": "MIT", @@ -4794,24 +4911,6 @@ "node": ">= 0.6" } }, - "node_modules/@next/env": { - "version": "14.2.35", - "license": "MIT" - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.33", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@noble/hashes": { "version": "1.8.0", "dev": true, @@ -4870,6 +4969,12 @@ "@noble/hashes": "^1.1.5" } }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "dev": true, @@ -5832,10 +5937,6 @@ "eslint": ">=9.0.0" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, "node_modules/@swc/helpers": { "version": "0.5.17", "license": "Apache-2.0", @@ -6971,6 +7072,12 @@ "node": ">=6.5" } }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -7330,6 +7437,15 @@ "version": "0.4.0", "license": "MIT" }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "license": "MIT", @@ -7343,6 +7459,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/avvio": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.1.0.tgz", + "integrity": "sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==", + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, "node_modules/axios": { "version": "1.12.0", "license": "MIT", @@ -8096,15 +8222,6 @@ "esbuild": ">=0.18" } }, - "node_modules/busboy": { - "version": "1.6.0", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "license": "MIT", @@ -8179,6 +8296,7 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001755", + "dev": true, "funding": [ { "type": "opencollective", @@ -8381,10 +8499,6 @@ "node": ">= 10" } }, - "node_modules/client-only": { - "version": "0.0.1", - "license": "MIT" - }, "node_modules/cliui": { "version": "8.0.1", "license": "ISC", @@ -10253,6 +10367,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -10288,11 +10408,44 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-json-stringify": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.2.0.tgz", + "integrity": "sha512-Eaf/KNIDwHkzfyeQFNfLXJnQ7cl1XQI3+zRqmPlvtkMigbXnAcasTrvJQmquBSxKfFGeRA6PFog8t+hFmpDoWw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "dev": true, "license": "MIT" }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "dev": true, @@ -10312,9 +10465,41 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastify": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.7.1.tgz", + "integrity": "sha512-ZW7S4fxlZhE+tYWVokFzjh+i56R+buYKNGhrVl6DtN8sxkyMEzpJnzvO8A/ZZrsg5w6X37u6I4EOQikYS5DXpA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, "node_modules/fastq": { "version": "1.19.1", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -10490,6 +10675,20 @@ "node": ">= 0.8" } }, + "node_modules/find-my-way": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.4.0.tgz", + "integrity": "sha512-5Ye4vHsypZRYtS01ob/iwHzGRUDELlsoCftI/OZFhcLs1M0tkGPcXldE80TAZC5yYuJMBPJQQ43UHlqbJWiX2w==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/find-replace": { "version": "3.0.0", "dev": true, @@ -12812,6 +13011,25 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/json-schema-to-zod": { "version": "2.6.1", "license": "ISC", @@ -12970,6 +13188,56 @@ "node": ">= 0.8.0" } }, + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" + } + }, + "node_modules/light-my-request/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/lilconfig": { "version": "3.1.3", "dev": true, @@ -14221,6 +14489,7 @@ }, "node_modules/nanoid": { "version": "3.3.11", + "dev": true, "funding": [ { "type": "github", @@ -14259,88 +14528,6 @@ "node": ">= 0.4.0" } }, - "node_modules/next": { - "version": "14.2.35", - "license": "MIT", - "dependencies": { - "@next/env": "14.2.35", - "@swc/helpers": "0.5.5", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", - "postcss": "8.4.31", - "styled-jsx": "5.1.1" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.33", - "@next/swc-darwin-x64": "14.2.33", - "@next/swc-linux-arm64-gnu": "14.2.33", - "@next/swc-linux-arm64-musl": "14.2.33", - "@next/swc-linux-x64-gnu": "14.2.33", - "@next/swc-linux-x64-musl": "14.2.33", - "@next/swc-win32-arm64-msvc": "14.2.33", - "@next/swc-win32-ia32-msvc": "14.2.33", - "@next/swc-win32-x64-msvc": "14.2.33" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/@swc/helpers": { - "version": "0.5.5", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/node-domexception": { "version": "1.0.0", "funding": [ @@ -14715,6 +14902,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "license": "MIT", @@ -15253,6 +15449,43 @@ "node": ">=6" } }, + "node_modules/pino": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.0.tgz", + "integrity": "sha512-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, "node_modules/pirates": { "version": "4.0.7", "dev": true, @@ -15441,6 +15674,22 @@ "version": "2.0.1", "license": "MIT" }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/prompts": { "version": "2.4.2", "dev": true, @@ -15606,6 +15855,12 @@ ], "license": "MIT" }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, "node_modules/quicktype": { "version": "23.1.1", "dev": true, @@ -16062,6 +16317,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/reflect-metadata": { "version": "0.2.2", "license": "Apache-2.0" @@ -16283,15 +16547,29 @@ "node": ">=8" } }, + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/reusify": { "version": "1.1.0", - "dev": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, "node_modules/rimraf": { "version": "6.0.1", "dev": true, @@ -16540,9 +16818,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-regex2": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", + "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + } + }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -16564,6 +16860,22 @@ "loose-envify": "^1.1.0" } }, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "7.7.1", "license": "ISC", @@ -16986,6 +17298,15 @@ "node": ">= 14" } }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/sort-keys": { "version": "5.1.0", "license": "MIT", @@ -17001,6 +17322,7 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -17060,6 +17382,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, @@ -17146,12 +17477,6 @@ "stream-chain": "^2.2.5" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "license": "MIT", @@ -17367,27 +17692,6 @@ "inline-style-parser": "0.2.4" } }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, "node_modules/stylis": { "version": "4.3.6", "license": "MIT" @@ -17627,6 +17931,18 @@ "node": ">=0.8" } }, + "node_modules/thread-stream": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz", + "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/through": { "version": "2.3.8", "dev": true, @@ -17704,6 +18020,15 @@ "node": ">=8.0" } }, + "node_modules/toad-cache": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz", + "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "license": "MIT", diff --git a/packages/api/src/clients/conversation/activity.ts b/packages/api/src/clients/conversation/activity.ts index ae3140093..896af120a 100644 --- a/packages/api/src/clients/conversation/activity.ts +++ b/packages/api/src/clients/conversation/activity.ts @@ -40,6 +40,15 @@ export class ConversationActivityClient { return res.data; } + + async createTargeted(conversationId: string, params: ActivityParams) { + const res = await this.http.post( + `${this.serviceUrl}/v3/conversations/${conversationId}/targetedActivity`, + params + ); + return res.data; + } + async update(conversationId: string, id: string, params: ActivityParams) { const res = await this.http.put( `${this.serviceUrl}/v3/conversations/${conversationId}/activities/${id}`, From 6df7ce3d93d3b10f786c50527197526e5662b83c Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 08:26:43 -0800 Subject: [PATCH 26/33] fix ci --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index fde635403..86ef50b6a 100644 --- a/package.json +++ b/package.json @@ -43,5 +43,8 @@ "@turbo/gen": "^2.5.7", "turbo": "^2.4.0", "typescript": "^5.4.5" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.40.1" } } From 8556c4a0a1bda4a41d2757b1301f8aedfcf8f72a Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 08:31:18 -0800 Subject: [PATCH 27/33] fix bot builder --- examples/http-adapters/package.json | 2 +- packages/apps/package.json | 2 +- packages/botbuilder/src/plugin.ts | 3 --- packages/dev/package.json | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/http-adapters/package.json b/examples/http-adapters/package.json index 448e9d9a2..4f4cb84d4 100644 --- a/examples/http-adapters/package.json +++ b/examples/http-adapters/package.json @@ -17,7 +17,7 @@ "@microsoft/teams.apps": "2.0.5", "@microsoft/teams.common": "2.0.5", "cors": "^2.8.5", - "express": "^4.21.0", + "express": "^5.0.0", "fastify": "^5.2.0", "hono": "^4.6.14" }, diff --git a/packages/apps/package.json b/packages/apps/package.json index 1291d0408..270a2ca20 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -41,7 +41,7 @@ "@azure/msal-node": "^3.8.1", "axios": "^1.12.0", "cors": "^2.8.5", - "express": "^4.22.0", + "express": "^5.0.0", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.2.0", "reflect-metadata": "^0.2.2" diff --git a/packages/botbuilder/src/plugin.ts b/packages/botbuilder/src/plugin.ts index 02c665f69..b28c9f8dc 100644 --- a/packages/botbuilder/src/plugin.ts +++ b/packages/botbuilder/src/plugin.ts @@ -46,9 +46,6 @@ export class BotBuilderPlugin implements IPlugin { @HttpServer() declare readonly httpServer: IHttpServer; - @Dependency() - declare readonly httpServer: IHttpServer; - @Dependency() declare readonly manifest: Partial; diff --git a/packages/dev/package.json b/packages/dev/package.json index c091c8350..044a92645 100644 --- a/packages/dev/package.json +++ b/packages/dev/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "axios": "^1.12.0", - "express": "^4.22.0", + "express": "^5.0.0", "jsonwebtoken": "^9.0.2", "uuid": "^11.0.5", "ws": "^8.18.1" From 42c7614d6ff3e1ee7a463c098a6a1419b2fcd226 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 14:31:20 -0800 Subject: [PATCH 28/33] Fix tests --- package-lock.json | 1259 +++++------------ .../apps/src/http/express-adapter.spec.ts | 144 ++ packages/apps/src/http/express-adapter.ts | 2 +- packages/botbuilder/src/plugin.spec.ts | 22 +- 4 files changed, 538 insertions(+), 889 deletions(-) create mode 100644 packages/apps/src/http/express-adapter.spec.ts diff --git a/package-lock.json b/package-lock.json index 6edb6017a..53fd9d84a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,9 @@ }, "engines": { "node": ">=20" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "4.40.1" } }, "examples/a2a": { @@ -181,7 +184,7 @@ "@microsoft/teams.apps": "2.0.5", "@microsoft/teams.common": "2.0.5", "cors": "^2.8.5", - "express": "^4.21.0", + "express": "^5.0.0", "fastify": "^5.2.0", "hono": "^4.6.14" }, @@ -3574,21 +3577,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/@inquirer/figures": { "version": "1.0.13", "dev": true, @@ -4382,642 +4370,182 @@ "mcp-inspector-server": "build/index.js" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/accepts": { - "version": "2.0.0", + "node_modules/@modelcontextprotocol/inspector/node_modules/data-uri-to-buffer": { + "version": "4.0.1", "dev": true, "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, "engines": { - "node": ">= 0.6" + "node": ">= 12" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/body-parser": { - "version": "2.2.1", + "node_modules/@modelcontextprotocol/inspector/node_modules/node-fetch": { + "version": "3.3.2", "dev": true, "license": "MIT", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/content-disposition": { - "version": "1.0.1", - "dev": true, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.25.2", "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.7", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" + }, "engines": { "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/cookie-signature": { - "version": "1.2.2", - "dev": true, + "node_modules/@modelcontextprotocol/sdk/node_modules/jose": { + "version": "6.1.3", "license": "MIT", - "engines": { - "node": ">=6.6.0" + "funding": { + "url": "https://github.com/sponsors/panva" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/express": { - "version": "5.2.1", + "node_modules/@noble/hashes": { + "version": "1.8.0", "dev": true, "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, "engines": { - "node": ">= 18" + "node": "^14.21.3 || >=16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/finalhandler": { - "version": "2.1.1", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 8" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/fresh": { - "version": "2.0.0", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 8" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/iconv-lite": { - "version": "0.7.0", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 8" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/media-typer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "license": "Apache-2.0", "engines": { - "node": ">= 0.8" + "node": ">=8.0.0" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/merge-descriptors": { - "version": "2.0.0", + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@noble/hashes": "^1.1.5" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/mime-db": { - "version": "1.54.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/mime-types": { - "version": "3.0.2", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, + "optional": true, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">=14" } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/negotiator": { - "version": "1.0.0", + "node_modules/@radix-ui/number": { + "version": "1.1.1", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/send": { - "version": "1.2.0", + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } + "license": "MIT" }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/serve-static": { - "version": "2.2.0", + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "@radix-ui/react-primitive": "2.1.3" }, - "engines": { - "node": ">= 18" + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, - "node_modules/@modelcontextprotocol/inspector-server/node_modules/type-is": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/inspector/node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@modelcontextprotocol/inspector/node_modules/node-fetch": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.2", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.7", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "jose": "^6.1.1", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { - "version": "0.7.0", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/jose": { - "version": "6.1.3", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { - "version": "1.54.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", "dev": true, "license": "MIT", "dependencies": { @@ -5882,6 +5410,19 @@ "darwin" ] }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", + "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "dev": true, @@ -7079,16 +6620,43 @@ "license": "MIT" }, "node_modules/accepts": { - "version": "1.3.8", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/acorn": { "version": "8.15.0", "dev": true, @@ -7286,10 +6854,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "license": "MIT" - }, "node_modules/array-includes": { "version": "3.1.8", "dev": true, @@ -7716,76 +7280,29 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.4", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.3", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/botbuilder": { "version": "4.23.1", "license": "MIT", @@ -8736,13 +8253,16 @@ } }, "node_modules/content-disposition": { - "version": "0.5.4", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/content-type": { @@ -8765,8 +8285,13 @@ } }, "node_modules/cookie-signature": { - "version": "1.0.7", - "license": "MIT" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/cookiejar": { "version": "2.1.4", @@ -9234,16 +8759,8 @@ "version": "1.1.0", "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "node_modules/detect-indent": { @@ -10291,43 +9808,42 @@ } }, "node_modules/express": { - "version": "4.22.0", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "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.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" }, "funding": { "type": "opencollective", @@ -10347,16 +9863,30 @@ "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/extend": { "version": "3.0.2", @@ -10642,37 +10172,24 @@ } }, "node_modules/finalhandler": { - "version": "1.3.2", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "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" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/find-my-way": { @@ -10852,10 +10369,12 @@ } }, "node_modules/fresh": { - "version": "0.5.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/fs-extra": { @@ -11402,17 +10921,23 @@ } }, "node_modules/http-errors": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-proxy-agent": { @@ -11466,13 +10991,19 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ieee754": { @@ -13787,15 +13318,22 @@ } }, "node_modules/media-typer": { - "version": "0.3.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { - "version": "1.0.3", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -13815,6 +13353,7 @@ }, "node_modules/methods": { "version": "1.1.2", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -14510,7 +14049,9 @@ "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -15374,10 +14915,6 @@ "node": "20 || >=22" } }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "license": "MIT" - }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -16016,45 +15553,6 @@ "node": ">= 0.10" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/rc": { "version": "1.2.8", "dev": true, @@ -16887,46 +16385,54 @@ } }, "node_modules/send": { - "version": "0.19.1", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-handler": { @@ -17012,66 +16518,22 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/debug": { - "version": "2.6.9", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-static/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/serve-static/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.19.0", - "license": "MIT", - "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" + "node": ">= 18" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/set-cookie-parser": { @@ -17416,7 +16878,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -18434,16 +17898,44 @@ } }, "node_modules/type-is": { - "version": "1.6.18", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "license": "MIT", @@ -18831,13 +18323,6 @@ "version": "1.0.2", "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "11.1.0", "funding": [ @@ -19431,7 +18916,7 @@ "@azure/msal-node": "^3.8.1", "axios": "^1.12.0", "cors": "^2.8.5", - "express": "^4.22.0", + "express": "^5.0.0", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.2.0", "reflect-metadata": "^0.2.2" @@ -19626,7 +19111,7 @@ "license": "MIT", "dependencies": { "axios": "^1.12.0", - "express": "^4.22.0", + "express": "^5.0.0", "jsonwebtoken": "^9.0.2", "uuid": "^11.0.5", "ws": "^8.18.1" diff --git a/packages/apps/src/http/express-adapter.spec.ts b/packages/apps/src/http/express-adapter.spec.ts new file mode 100644 index 000000000..186b9e5a9 --- /dev/null +++ b/packages/apps/src/http/express-adapter.spec.ts @@ -0,0 +1,144 @@ +import http from 'http'; + +import supertest from 'supertest'; + +import { ExpressAdapter } from './express-adapter'; + +describe('ExpressAdapter', () => { + let server: http.Server; + let adapter: ExpressAdapter; + + afterEach(() => { + if (server) { + server.close(); + } + }); + + it('should initialize without path-to-regexp errors', () => { + // This test ensures that the middleware setup works with Express 5's + // stricter path-to-regexp validation (no wildcards like /api*) + server = http.createServer(); + expect(() => { + adapter = new ExpressAdapter(server); + }).not.toThrow(); + }); + + describe('route registration and request handling', () => { + it('should handle POST requests with JSON body parsing', async () => { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + const mockHandler = jest.fn(async ({ extractRequestData, sendResponse }) => { + const { body } = extractRequestData(); + sendResponse({ status: 200, body: { echo: body.message } }); + }); + + adapter.registerRouteHandler({ + path: '/api/messages', + handler: mockHandler + }); + + const response = await supertest(server) + .post('/api/messages') + .send({ message: 'hello' }) + .expect(200); + + expect(response.body).toEqual({ echo: 'hello' }); + expect(mockHandler).toHaveBeenCalled(); + }); + + it('should extract request headers correctly', async () => { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + let extractedHeaders: Record | undefined; + + adapter.registerRouteHandler({ + path: '/api/test', + handler: async ({ extractRequestData, sendResponse }) => { + const { headers } = extractRequestData(); + extractedHeaders = headers; + sendResponse({ status: 200, body: { ok: true } }); + } + }); + + await supertest(server) + .post('/api/test') + .set('Authorization', 'Bearer token123') + .set('X-Custom-Header', 'custom-value') + .expect(200); + + expect(extractedHeaders).toBeDefined(); + expect(extractedHeaders!['authorization']).toBe('Bearer token123'); + expect(extractedHeaders!['x-custom-header']).toBe('custom-value'); + }); + + it('should handle errors in route handlers gracefully', async () => { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + adapter.registerRouteHandler({ + path: '/api/error', + handler: async () => { + throw new Error('Handler error'); + } + }); + + // Express default error handler should catch this and return 500 + const response = await supertest(server) + .post('/api/error') + .expect(500); + + // Express default error handler sends HTML error page in development + expect(response.text).toContain('Error'); + }); + + it('should set Content-Type to application/json for responses', async () => { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + adapter.registerRouteHandler({ + path: '/api/test', + handler: async ({ sendResponse }) => { + sendResponse({ status: 200, body: { data: 'test' } }); + } + }); + + const response = await supertest(server) + .post('/api/test') + .expect(200); + + expect(response.headers['content-type']).toMatch(/application\/json/); + }); + + it('should apply CORS headers', async () => { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + adapter.registerRouteHandler({ + path: '/api/test', + handler: async ({ sendResponse }) => { + sendResponse({ status: 200, body: { ok: true } }); + } + }); + + const response = await supertest(server) + .post('/api/test') + .expect(200); + + // CORS middleware should add these headers + expect(response.headers['access-control-allow-origin']).toBeDefined(); + }); + }); + + describe('static file serving', () => { + it('should configure static file serving without errors', () => { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + expect(() => { + adapter.serveStatic('/static', './public'); + }).not.toThrow(); + }); + }); +}); diff --git a/packages/apps/src/http/express-adapter.ts b/packages/apps/src/http/express-adapter.ts index 1c759aa92..40b17e92f 100644 --- a/packages/apps/src/http/express-adapter.ts +++ b/packages/apps/src/http/express-adapter.ts @@ -49,7 +49,7 @@ export class ExpressAdapter implements IHttpAdapter { // Setup middleware this.express.use(cors()); - this.express.use('/api*', express.json()); + this.express.use(express.json()); } /** diff --git a/packages/botbuilder/src/plugin.spec.ts b/packages/botbuilder/src/plugin.spec.ts index 0f6bc5ede..bea0eb563 100644 --- a/packages/botbuilder/src/plugin.spec.ts +++ b/packages/botbuilder/src/plugin.spec.ts @@ -3,11 +3,30 @@ import e from 'express'; import { IMessageActivity, IToken, MessageActivity } from '@microsoft/teams.api'; -import { App, IPluginStartEvent } from '@microsoft/teams.apps'; +import { App, IPluginStartEvent, ExpressAdapter } from '@microsoft/teams.apps'; import { JwtValidatedRequest } from '@microsoft/teams.apps/dist/middleware'; import { BotBuilderPlugin } from './plugin'; +// Mock adapter that extends ExpressAdapter to pass instanceof check +// while avoiding real server operations in tests +class MockExpressAdapter extends ExpressAdapter { + constructor() { + // Don't create real server - pass undefined + super(undefined); + } + + // Override to prevent actual server start + async start(_port: number): Promise { + return Promise.resolve(); + } + + // Override to prevent server close operations + async stop(): Promise { + return Promise.resolve(); + } +} + class TestBotBuilderPlugin extends BotBuilderPlugin { async onStart(_event: IPluginStartEvent) { // No-op for tests @@ -47,6 +66,7 @@ describe('BotBuilderPlugin', () => { }); app = new App({ plugins: [plugin], + httpAdapter: new MockExpressAdapter(), }); app.start(); }); From df6cf8143da9a43071ef479c24107fad81bfb0bd Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 14:37:27 -0800 Subject: [PATCH 29/33] Fix --- examples/http-adapters/fastify/fastify-adapter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/http-adapters/fastify/fastify-adapter.ts b/examples/http-adapters/fastify/fastify-adapter.ts index 7ca779977..bd5f7b74c 100644 --- a/examples/http-adapters/fastify/fastify-adapter.ts +++ b/examples/http-adapters/fastify/fastify-adapter.ts @@ -36,11 +36,11 @@ export class FastifyAdapter implements IHttpAdapter { * Register a route with Fastify */ registerRouteHandler(config: IRouteConfig): void { - const { method, path, handler } = config; + const { path, handler } = config; // Register with Fastify this.fastify.route({ - method: method.toUpperCase() as any, + method: 'POST', url: path, handler: async (request, reply) => { try { From 1d3651bb3d3e1b73e8ceff8b60c34abf67886ca4 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 14:50:10 -0800 Subject: [PATCH 30/33] Add build essential --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 86ef50b6a..df70544ea 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "clean": "npx turbo clean", "build": "npx turbo build", "build:packages": "npx turbo build --filter=./packages/*", + "build:essential": "npx turbo build --filter='./packages/*' --filter='!./packages/graph' --filter='!./packages/graph-endpoints' --filter='!./packages/graph-endpoints-beta' --filter='!./packages/graph-tools' --filter='!./external/*'", "build:examples": "npx turbo build --filter=./examples/*", "build:external": "npx turbo build --filter=./external/*", "dev": "npx turbo dev", From e6e08a00fcefa4e40e8f82de6fb64c8d0a05d688 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 15:05:14 -0800 Subject: [PATCH 31/33] Revert express --- examples/http-adapters/package.json | 2 +- package-lock.json | 821 +++++++++++++++++- packages/apps/package.json | 2 +- .../apps/src/http/express-adapter.spec.ts | 5 +- packages/apps/src/http/express-adapter.ts | 2 +- packages/dev/package.json | 2 +- 6 files changed, 823 insertions(+), 11 deletions(-) diff --git a/examples/http-adapters/package.json b/examples/http-adapters/package.json index 4f4cb84d4..e360e7cbc 100644 --- a/examples/http-adapters/package.json +++ b/examples/http-adapters/package.json @@ -17,7 +17,7 @@ "@microsoft/teams.apps": "2.0.5", "@microsoft/teams.common": "2.0.5", "cors": "^2.8.5", - "express": "^5.0.0", + "express": "^4.22.0", "fastify": "^5.2.0", "hono": "^4.6.14" }, diff --git a/package-lock.json b/package-lock.json index 53fd9d84a..60398cb35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -184,7 +184,7 @@ "@microsoft/teams.apps": "2.0.5", "@microsoft/teams.common": "2.0.5", "cors": "^2.8.5", - "express": "^5.0.0", + "express": "^4.22.0", "fastify": "^5.2.0", "hono": "^4.6.14" }, @@ -198,6 +198,267 @@ "typescript": "^5.4.5" } }, + "examples/http-adapters/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "examples/http-adapters/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "examples/http-adapters/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "examples/http-adapters/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "examples/http-adapters/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "examples/http-adapters/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "examples/http-adapters/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "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.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "examples/http-adapters/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "examples/http-adapters/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "examples/http-adapters/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "examples/http-adapters/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "examples/http-adapters/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/http-adapters/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "examples/http-adapters/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "examples/http-adapters/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "examples/http-adapters/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "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.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "examples/http-adapters/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "examples/http-adapters/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "examples/lights": { "name": "@examples/lights", "version": "0.0.6", @@ -6854,6 +7115,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.8", "dev": true, @@ -8763,6 +9030,16 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "dev": true, @@ -13353,7 +13630,6 @@ }, "node_modules/methods": { "version": "1.1.2", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -14915,6 +15191,12 @@ "node": "20 || >=22" } }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -18323,6 +18605,15 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "11.1.0", "funding": [ @@ -18916,7 +19207,7 @@ "@azure/msal-node": "^3.8.1", "axios": "^1.12.0", "cors": "^2.8.5", - "express": "^5.0.0", + "express": "^4.22.0", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.2.0", "reflect-metadata": "^0.2.2" @@ -18966,6 +19257,267 @@ "node": ">=16" } }, + "packages/apps/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/apps/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "packages/apps/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/apps/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "packages/apps/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "packages/apps/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "packages/apps/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "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.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "packages/apps/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/apps/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/apps/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/apps/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/apps/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/apps/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "packages/apps/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/apps/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/apps/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "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.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/apps/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/apps/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "packages/apps/node_modules/uuid": { "version": "8.3.2", "license": "MIT", @@ -19111,7 +19663,7 @@ "license": "MIT", "dependencies": { "axios": "^1.12.0", - "express": "^5.0.0", + "express": "^4.22.0", "jsonwebtoken": "^9.0.2", "uuid": "^11.0.5", "ws": "^8.18.1" @@ -19148,6 +19700,267 @@ "@types/node": "*" } }, + "packages/dev/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/dev/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "packages/dev/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/dev/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "packages/dev/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "packages/dev/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "packages/dev/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "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.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "packages/dev/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/dev/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/dev/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/dev/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/dev/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/dev/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "packages/dev/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "packages/dev/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/dev/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "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.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/dev/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "packages/dev/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "packages/devtools": { "name": "@microsoft/teams.devtools", "version": "2.0.5", diff --git a/packages/apps/package.json b/packages/apps/package.json index 270a2ca20..1291d0408 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -41,7 +41,7 @@ "@azure/msal-node": "^3.8.1", "axios": "^1.12.0", "cors": "^2.8.5", - "express": "^5.0.0", + "express": "^4.22.0", "jsonwebtoken": "^9.0.2", "jwks-rsa": "^3.2.0", "reflect-metadata": "^0.2.2" diff --git a/packages/apps/src/http/express-adapter.spec.ts b/packages/apps/src/http/express-adapter.spec.ts index 186b9e5a9..5a695b917 100644 --- a/packages/apps/src/http/express-adapter.spec.ts +++ b/packages/apps/src/http/express-adapter.spec.ts @@ -14,9 +14,8 @@ describe('ExpressAdapter', () => { } }); - it('should initialize without path-to-regexp errors', () => { - // This test ensures that the middleware setup works with Express 5's - // stricter path-to-regexp validation (no wildcards like /api*) + it('should initialize without errors', () => { + // This test ensures that the middleware setup works correctly server = http.createServer(); expect(() => { adapter = new ExpressAdapter(server); diff --git a/packages/apps/src/http/express-adapter.ts b/packages/apps/src/http/express-adapter.ts index 40b17e92f..1c759aa92 100644 --- a/packages/apps/src/http/express-adapter.ts +++ b/packages/apps/src/http/express-adapter.ts @@ -49,7 +49,7 @@ export class ExpressAdapter implements IHttpAdapter { // Setup middleware this.express.use(cors()); - this.express.use(express.json()); + this.express.use('/api*', express.json()); } /** diff --git a/packages/dev/package.json b/packages/dev/package.json index 044a92645..c091c8350 100644 --- a/packages/dev/package.json +++ b/packages/dev/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "axios": "^1.12.0", - "express": "^5.0.0", + "express": "^4.22.0", "jsonwebtoken": "^9.0.2", "uuid": "^11.0.5", "ws": "^8.18.1" From b5139d0298822e8c33095cc9a7610b55c00de8ea Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 18:46:58 -0800 Subject: [PATCH 32/33] add test for tab --- examples/tab/appPackage/color.png | Bin 0 -> 1065 bytes examples/tab/appPackage/manifest.json | 57 ++++++++++++++++++ examples/tab/appPackage/outline.png | Bin 0 -> 248 bytes .../apps/src/http/express-adapter.spec.ts | 57 ++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 examples/tab/appPackage/color.png create mode 100644 examples/tab/appPackage/manifest.json create mode 100644 examples/tab/appPackage/outline.png diff --git a/examples/tab/appPackage/color.png b/examples/tab/appPackage/color.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bd0a6505788838140519a9970ab45200a1c0f6 GIT binary patch literal 1065 zcmeAS@N?&q;$mQ6;Pv!y2?EjwK$wFKNCw@>VFyy21s;*b3=G`DAk4@xYmNj^kg+(( z-HBn{IhmJ04okYDuOkD)#(wTUiL49^%=$$TEMMwi2mImKoFsvD%tVkUgvc<17|H#h$teq7hM z?5{a@3ul7~;{-K^ODqnv7(9d-GMN;78J5sPP+!dK@vm=rJAeMnvur*6`EJqIyzOU> zNhT=!S^fw&e}Dh~ua@`!mvSU9``P~BPwR1DXqHa>Ab&=zk%7(Z)&u()noNv5Syv9$ z8+fy%f9LQ2-MaA2_uo&SuDrb<#-&WWy-fN7{TfRG$-b^viI=ibV zE9~-IM!(wWkJe}}Pcsc=Sj=N5m~-5OvB&I%%Ld+H7K2v_!Uunt$sc&p?8B0L`;X3r zjR(J8m*20u{KMPw`}UQ&y$8-*nDIv*Ux?Z$=QzAxcY6B!GXHJv@#UFy@8T8*@2vQp zcGD`o!7+C3`+uDYA)9sniX1rL)|;@b^gNTqoeaS<+g`*oNE>*u7{9AfZ0NNpW!aqf zJxMIX`5MPHdpr4boY8k{%XX(V-R^Ehs~$&+UoW@=iuefSr}k2rtyenq&Xu3$FI#4p z_FnzMle%4dqwBuZG%aQkP-uG0BB0pxoKwMt#oyPOyJXeP{^ZTJi)GGB9X!?gk^S;H zrrs|-8>T*%oD`{Wi%JP+p5V8sJ!LjE8-6mZyZ3h5>-2AX>VLlaYBXtL-}6s*uDxKN z{hxD7-OTWByZ)!xt*@W`Nb11!Uzs(2{=UV6Z%+TUn1BBBvRSO3RPE0{FS=8**`b|# z&+OarV$+^JdMn-hU)k(`kHHUl8|5Ce0ZQ%n{=XH^xb>fR*`d#h)Am>T0JAoOr>mdK II;Vst03G$2pa1{> literal 0 HcmV?d00001 diff --git a/examples/tab/appPackage/manifest.json b/examples/tab/appPackage/manifest.json new file mode 100644 index 000000000..c3cdde9a6 --- /dev/null +++ b/examples/tab/appPackage/manifest.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.20/MicrosoftTeams.schema.json", + "version": "1.0.0", + "manifestVersion": "1.20", + "id": "${{TEAMS_APP_ID}}", + "name": { + "short": "tab-tester", + "full": "tab tester agent" + }, + "developer": { + "name": "Microsoft", + "mpnId": "", + "websiteUrl": "https://microsoft.com", + "privacyUrl": "https://privacy.microsoft.com/privacystatement", + "termsOfUseUrl": "https://www.microsoft.com/legal/terms-of-use" + }, + "description": { + "short": "Sample bot that repeats back what you say", + "full": "Sample bot that repeats back what you say" + }, + "icons": { + "outline": "outline.png", + "color": "color.png" + }, + "accentColor": "#FFFFFF", + "staticTabs": [ + { + "entityId": "conversations", + "scopes": ["personal"] + }, + { + "entityId": "about", + "scopes": ["personal"] + }, + { + "entityId": "test", + "name": "Test Tab", + "contentUrl": "https://${{BOT_DOMAIN}}/tabs/test/", + "scopes": ["personal"] + } + ], + "bots": [ + { + "botId": "${{BOT_ID}}", + "scopes": ["personal", "team", "groupChat"], + "isNotificationOnly": false, + "supportsCalling": false, + "supportsVideo": false, + "supportsFiles": false + } + ], + "validDomains": ["${{BOT_DOMAIN}}", "*.botframework.com"], + "webApplicationInfo": { + "id": "${{BOT_ID}}", + "resource": "api://botid-${{BOT_ID}}" + } +} diff --git a/examples/tab/appPackage/outline.png b/examples/tab/appPackage/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ae0b88c6cee9d4d0394e2ed661cadf66c9a783 GIT binary patch literal 248 zcmeAS@N?&q;$mQ6;Pv!y2?EjzAk4uAB#W!6z5prC0*}aI1_o|n5N2eUHAey{$XFcY z?!>U}oXkrghb7(7*O7r?V?XzwL{=cb&(p;*q=ND7G)KM$1s;}edG`2yOr0`4PTo>S zQ=Tti&$ez?4LKsnAXv4iB1z_+N|Qz4uBqiGB3_yQl;8?!j9>PB8UMKi&F5iZJqn_t%cn6^NjS2~I{ErH{@;03kgQT-S1HkNldGX_42JueW{z$6mk ol#n)gW4@hj!tInbOYXg4F7 literal 0 HcmV?d00001 diff --git a/packages/apps/src/http/express-adapter.spec.ts b/packages/apps/src/http/express-adapter.spec.ts index 5a695b917..0daa8f9e3 100644 --- a/packages/apps/src/http/express-adapter.spec.ts +++ b/packages/apps/src/http/express-adapter.spec.ts @@ -139,5 +139,62 @@ describe('ExpressAdapter', () => { adapter.serveStatic('/static', './public'); }).not.toThrow(); }); + + it('should serve static files from directory', async () => { + const fs = require('fs'); + const path = require('path'); + const os = require('os'); + + // Create a temporary directory with a test file + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'express-static-test-')); + const testHtml = path.join(tmpDir, 'index.html'); + fs.writeFileSync(testHtml, 'Test Page'); + + try { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + adapter.serveStatic('/tabs/test', tmpDir); + + const response = await supertest(server) + .get('/tabs/test/index.html') + .expect(200); + + expect(response.text).toContain('Test Page'); + } finally { + // Clean up + fs.unlinkSync(testHtml); + fs.rmdirSync(tmpDir); + } + }); + + it('should serve index.html when accessing directory path with trailing slash', async () => { + const fs = require('fs'); + const path = require('path'); + const os = require('os'); + + // Create a temporary directory with an index.html file + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'express-static-test-')); + const indexHtml = path.join(tmpDir, 'index.html'); + fs.writeFileSync(indexHtml, 'Index Page'); + + try { + server = http.createServer(); + adapter = new ExpressAdapter(server); + + adapter.serveStatic('/tabs/test', tmpDir); + + // Accessing /tabs/test/ with trailing slash should serve index.html + const response = await supertest(server) + .get('/tabs/test/') + .expect(200); + + expect(response.text).toContain('Index Page'); + } finally { + // Clean up + fs.unlinkSync(indexHtml); + fs.rmdirSync(tmpDir); + } + }); }); }); From 95d91e9a66d61c2456a16c34ad2a0d6a93310135 Mon Sep 17 00:00:00 2001 From: heyitsaamir Date: Sat, 24 Jan 2026 22:42:47 -0800 Subject: [PATCH 33/33] fix tests --- packages/apps/src/http/express-adapter.spec.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/apps/src/http/express-adapter.spec.ts b/packages/apps/src/http/express-adapter.spec.ts index 0daa8f9e3..724bb2f77 100644 --- a/packages/apps/src/http/express-adapter.spec.ts +++ b/packages/apps/src/http/express-adapter.spec.ts @@ -1,5 +1,9 @@ +import fs from 'fs'; import http from 'http'; +import os from 'os'; +import path from 'path'; + import supertest from 'supertest'; import { ExpressAdapter } from './express-adapter'; @@ -141,10 +145,6 @@ describe('ExpressAdapter', () => { }); it('should serve static files from directory', async () => { - const fs = require('fs'); - const path = require('path'); - const os = require('os'); - // Create a temporary directory with a test file const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'express-static-test-')); const testHtml = path.join(tmpDir, 'index.html'); @@ -169,10 +169,6 @@ describe('ExpressAdapter', () => { }); it('should serve index.html when accessing directory path with trailing slash', async () => { - const fs = require('fs'); - const path = require('path'); - const os = require('os'); - // Create a temporary directory with an index.html file const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'express-static-test-')); const indexHtml = path.join(tmpDir, 'index.html');