diff --git a/.env.example b/.env.example
index 688dd43..d365a35 100644
--- a/.env.example
+++ b/.env.example
@@ -19,12 +19,39 @@ S3_SECRET_ACCESS_KEY=image-password
S3_FORCE_PATH_STYLE=true
# Future local services
-PUBLIC_API_BASE_URL=http://localhost:3001
+BACKEND_PORT=3001
+ADMIN_PORT=5173
+GATEWAY_HOST=0.0.0.0
+GATEWAY_PORT=8888
+PUBLIC_BACKEND_BASE_URL=http://localhost:3001
+PUBLIC_ADMIN_BASE_URL=http://localhost:5173
PUBLIC_IMAGE_BASE_URL=http://localhost:8888
-# imgproxy is always external for image-platform.
-# Local example: run imgproxy separately on localhost:18080.
+# Gateway proxies /api and Swagger routes to this upstream.
+GATEWAY_BACKEND_UPSTREAM=http://localhost:3001
+
+# Dev imgproxy is exposed only on localhost.
+IMGPROXY_PORT=18080
IMGPROXY_UPSTREAM=http://localhost:18080
IMGPROXY_SIGNING_ENABLED=false
IMGPROXY_KEY=
IMGPROXY_SALT=
+IMGPROXY_WORKERS=2
+IMGPROXY_MAX_SRC_RESOLUTION=20
+IMGPROXY_DOWNLOAD_TIMEOUT=30
+IMGPROXY_ALLOWED_SOURCES=
+
+# RabbitMQ dev broker is exposed only on localhost.
+RABBITMQ_DEFAULT_USER=image
+RABBITMQ_DEFAULT_PASS=image-password
+RABBITMQ_DEFAULT_VHOST=image_platform
+RABBITMQ_PORT=5672
+RABBITMQ_MANAGEMENT_PORT=15672
+RABBITMQ_URL=amqp://image:image-password@localhost:5672/image_platform
+WORKER_PREFETCH=2
+
+# Queue topology
+RABBITMQ_JOBS_EXCHANGE=image-platform.jobs
+RABBITMQ_GENERATE_VARIANT_QUEUE=image.generate-variant
+RABBITMQ_GENERATE_VARIANT_DLX=image-platform.jobs.dlx
+RABBITMQ_GENERATE_VARIANT_DLQ=image.generate-variant.dlq
diff --git a/README.md b/README.md
index 59283b0..a09a4f5 100644
--- a/README.md
+++ b/README.md
@@ -4,16 +4,18 @@ Image Platform - отдельная площадка для управления
## Статус
-Сейчас создан только базовый monorepo и dev-инфраструктура. Приложения `api`, `admin` и `gateway` пока намеренно не созданы.
+Сейчас создан базовый monorepo, dev-инфраструктура, NestJS backend с Swagger, чистый Vite React TS admin, Fastify gateway skeleton, Drizzle database package, shared queue/storage packages и worker skeleton.
## Целевая схема
```text
client
-> CDN optional
--> gateway Caddy/Souin hot cache
+-> Fastify gateway + L1 memory cache
+-> NestJS backend
-> S3/Object Storage persistent variants
--> generator/worker
+-> generator/worker on miss
+-> RabbitMQ
-> external imgproxy
-> source/original image
```
@@ -27,20 +29,28 @@ client
- PostgreSQL
- MinIO
- MinIO bucket init
+- imgproxy dev instance
+- RabbitMQ
-Позже нодой будут запускаться:
+Нодой запускается:
-- NestJS API
-- worker
+- NestJS backend
- React/Vite admin
+- Fastify gateway
+- worker
-Gateway будет добавлен отдельно позже.
+Gateway уже добавлен как JS/Fastify skeleton. Сейчас `/images/*` возвращает `501`, пока не подключены DB/S3/imgproxy.
```bash
cp .env.example .env
pnpm install
pnpm infra:up
+pnpm db:migrate
pnpm infra:config
+pnpm backend:dev
+pnpm admin:dev
+pnpm gateway:dev
+pnpm worker:dev
```
Порты по умолчанию:
@@ -50,11 +60,21 @@ pnpm infra:config
| PostgreSQL | `localhost:5433` |
| MinIO API | `http://localhost:9000` |
| MinIO Console | `http://localhost:9001` |
+| imgproxy | `http://localhost:18080` |
+| RabbitMQ | `amqp://localhost:5672` |
+| RabbitMQ Management | `http://localhost:15672` |
+| Backend API | `http://localhost:3001/api` |
+| Swagger | `http://localhost:3001/docs` |
+| Admin | `http://localhost:5173` |
+| Gateway | `http://localhost:8888` |
+
+Если старый локальный `image-gateway` уже занимает `8888`, остановите его или задайте другой `GATEWAY_PORT` в `.env`.
## Документация
- `docs/architecture.md` - целевая архитектура и ответственность компонентов.
- `docs/development.md` - локальный dev flow.
-- `docs/data-model.md` - черновик PostgreSQL модели.
-- `docs/api-contract-draft.md` - черновик будущего JSON API.
+- `docs/data-model.md` - текущая Drizzle/PostgreSQL модель.
+- `docs/backend-contract-draft.md` - черновик будущего backend-контракта.
- `docs/imgproxy-contract.md` - контракт с external imgproxy.
+- `docs/next-image-provider.md` - контракт custom provider для `next/image`.
diff --git a/apps/admin/index.html b/apps/admin/index.html
new file mode 100644
index 0000000..dc5b23f
--- /dev/null
+++ b/apps/admin/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Image Platform Admin
+
+
+
+
+
+
diff --git a/apps/admin/package.json b/apps/admin/package.json
new file mode 100644
index 0000000..3eea7ff
--- /dev/null
+++ b/apps/admin/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@image-platform/admin",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "tsc -b && vite build",
+ "dev": "vite --host 0.0.0.0 --port 5173",
+ "preview": "vite preview --host 0.0.0.0 --port 5173",
+ "typecheck": "tsc -b"
+ },
+ "dependencies": {
+ "react": "^19.2.5",
+ "react-dom": "^19.2.5"
+ },
+ "devDependencies": {
+ "@types/node": "^24.12.2",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "typescript": "^5.9.3",
+ "vite": "^8.0.10"
+ }
+}
diff --git a/apps/admin/src/App.css b/apps/admin/src/App.css
new file mode 100644
index 0000000..7341438
--- /dev/null
+++ b/apps/admin/src/App.css
@@ -0,0 +1,111 @@
+:root {
+ color: #171411;
+ background: #f7f4ee;
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ min-width: 320px;
+ min-height: 100vh;
+ margin: 0;
+ background:
+ radial-gradient(circle at 18% 18%, rgba(123, 76, 255, 0.18), transparent 30rem),
+ #f7f4ee;
+}
+
+button,
+input,
+textarea,
+select {
+ font: inherit;
+}
+
+.app-shell {
+ min-height: 100vh;
+ padding: 48px 24px;
+}
+
+.hero {
+ max-width: 960px;
+ margin: 0 auto;
+ padding: 40px;
+ border: 1px solid #e4ded4;
+ border-radius: 32px;
+ background: rgba(255, 255, 255, 0.82);
+ box-shadow: 0 22px 80px rgba(40, 32, 21, 0.08);
+}
+
+.eyebrow {
+ margin: 0 0 16px;
+ color: #7b4cff;
+ font-size: 13px;
+ font-weight: 700;
+ letter-spacing: 0.22em;
+ text-transform: uppercase;
+}
+
+h1 {
+ max-width: 760px;
+ margin: 0;
+ font-size: clamp(40px, 7vw, 76px);
+ line-height: 0.92;
+ letter-spacing: -0.06em;
+}
+
+.lead {
+ max-width: 680px;
+ margin: 24px 0 0;
+ color: #73695d;
+ font-size: 18px;
+ line-height: 1.7;
+}
+
+.cards {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+ max-width: 960px;
+ margin: 24px auto 0;
+}
+
+.card {
+ min-height: 150px;
+ padding: 24px;
+ border: 1px solid #e4ded4;
+ border-radius: 24px;
+ background: rgba(255, 255, 255, 0.76);
+}
+
+.card h2 {
+ margin: 0;
+ font-size: 18px;
+}
+
+.card p {
+ margin: 12px 0 0;
+ color: #73695d;
+ line-height: 1.55;
+}
+
+@media (max-width: 720px) {
+ .app-shell {
+ padding: 24px 16px;
+ }
+
+ .hero {
+ padding: 28px;
+ border-radius: 24px;
+ }
+
+ .cards {
+ grid-template-columns: 1fr;
+ }
+}
diff --git a/apps/admin/src/App.tsx b/apps/admin/src/App.tsx
new file mode 100644
index 0000000..0cb641f
--- /dev/null
+++ b/apps/admin/src/App.tsx
@@ -0,0 +1,40 @@
+import "./App.css"
+
+const cards = [
+ {
+ title: "Assets",
+ description: "Каталог исходных изображений и связанной metadata.",
+ },
+ {
+ title: "Variants",
+ description: "Будущие AVIF/WebP/JPEG variants, presets и статусы генерации.",
+ },
+ {
+ title: "Storage",
+ description: "PostgreSQL как source of truth, S3/MinIO как хранилище bytes.",
+ },
+]
+
+export function App() {
+ return (
+
+
+ Image Platform Admin
+ чистый Vite React TS app
+
+ Это стартовая админка без UI-фреймворков. Дальше сюда добавим управление allowed hosts,
+ assets, variants и presets.
+
+
+
+
+ {cards.map((card) => (
+
+ {card.title}
+ {card.description}
+
+ ))}
+
+
+ )
+}
diff --git a/apps/admin/src/main.tsx b/apps/admin/src/main.tsx
new file mode 100644
index 0000000..2c97ca9
--- /dev/null
+++ b/apps/admin/src/main.tsx
@@ -0,0 +1,10 @@
+import { StrictMode } from "react"
+import { createRoot } from "react-dom/client"
+
+import { App } from "./App"
+
+createRoot(document.getElementById("root")!).render(
+
+
+ ,
+)
diff --git a/apps/admin/tsconfig.app.json b/apps/admin/tsconfig.app.json
new file mode 100644
index 0000000..8fcfef4
--- /dev/null
+++ b/apps/admin/tsconfig.app.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src"]
+}
diff --git a/apps/admin/tsconfig.json b/apps/admin/tsconfig.json
new file mode 100644
index 0000000..ea9d0cd
--- /dev/null
+++ b/apps/admin/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ]
+}
diff --git a/apps/admin/tsconfig.node.json b/apps/admin/tsconfig.node.json
new file mode 100644
index 0000000..5742780
--- /dev/null
+++ b/apps/admin/tsconfig.node.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+ "target": "ES2023",
+ "lib": ["ES2023"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "strict": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "allowSyntheticDefaultImports": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "types": ["node"]
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/apps/admin/vite.config.ts b/apps/admin/vite.config.ts
new file mode 100644
index 0000000..322f82f
--- /dev/null
+++ b/apps/admin/vite.config.ts
@@ -0,0 +1,6 @@
+import react from "@vitejs/plugin-react"
+import { defineConfig } from "vite"
+
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/apps/backend/nest-cli.json b/apps/backend/nest-cli.json
new file mode 100644
index 0000000..f9aa683
--- /dev/null
+++ b/apps/backend/nest-cli.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "https://json.schemastore.org/nest-cli",
+ "collection": "@nestjs/schematics",
+ "sourceRoot": "src",
+ "compilerOptions": {
+ "deleteOutDir": true
+ }
+}
diff --git a/apps/backend/package.json b/apps/backend/package.json
new file mode 100644
index 0000000..697927e
--- /dev/null
+++ b/apps/backend/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "@image-platform/backend",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "build": "nest build",
+ "dev": "nest start --watch",
+ "start": "node dist/main.js",
+ "typecheck": "tsc --noEmit -p tsconfig.json"
+ },
+ "dependencies": {
+ "@nestjs/common": "^11.0.0",
+ "@nestjs/core": "^11.0.0",
+ "@nestjs/platform-express": "^11.0.0",
+ "@nestjs/swagger": "^11.0.0",
+ "reflect-metadata": "^0.2.2",
+ "rxjs": "^7.8.1",
+ "swagger-ui-express": "^5.0.1"
+ },
+ "devDependencies": {
+ "@nestjs/cli": "^11.0.0",
+ "@nestjs/schematics": "^11.0.0",
+ "@types/node": "^24.0.0",
+ "@types/swagger-ui-express": "^4.1.8",
+ "typescript": "^5.9.0"
+ }
+}
diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts
new file mode 100644
index 0000000..87c7eba
--- /dev/null
+++ b/apps/backend/src/app.module.ts
@@ -0,0 +1,9 @@
+import { Module } from "@nestjs/common"
+
+import { HealthController } from "./health/health.controller"
+import { InternalImagesController } from "./internal-images/internal-images.controller"
+
+@Module({
+ controllers: [HealthController, InternalImagesController],
+})
+export class AppModule {}
diff --git a/apps/backend/src/health/health-response.dto.ts b/apps/backend/src/health/health-response.dto.ts
new file mode 100644
index 0000000..2f08316
--- /dev/null
+++ b/apps/backend/src/health/health-response.dto.ts
@@ -0,0 +1,9 @@
+import { ApiProperty } from "@nestjs/swagger"
+
+export class HealthResponseDto {
+ @ApiProperty({ example: "image-platform-api" })
+ service!: string
+
+ @ApiProperty({ example: "ok" })
+ status!: string
+}
diff --git a/apps/backend/src/health/health.controller.ts b/apps/backend/src/health/health.controller.ts
new file mode 100644
index 0000000..c2d742f
--- /dev/null
+++ b/apps/backend/src/health/health.controller.ts
@@ -0,0 +1,18 @@
+import { Controller, Get } from "@nestjs/common"
+import { ApiOkResponse, ApiOperation, ApiTags } from "@nestjs/swagger"
+
+import { HealthResponseDto } from "./health-response.dto"
+
+@ApiTags("system")
+@Controller("health")
+export class HealthController {
+ @Get()
+ @ApiOperation({ summary: "Проверить состояние API" })
+ @ApiOkResponse({ type: HealthResponseDto })
+ getHealth(): HealthResponseDto {
+ return {
+ service: "image-platform-api",
+ status: "ok",
+ }
+ }
+}
diff --git a/apps/backend/src/internal-images/ensure-image-variant.dto.ts b/apps/backend/src/internal-images/ensure-image-variant.dto.ts
new file mode 100644
index 0000000..3129fb4
--- /dev/null
+++ b/apps/backend/src/internal-images/ensure-image-variant.dto.ts
@@ -0,0 +1,21 @@
+import { ApiProperty } from "@nestjs/swagger"
+
+export class EnsureImageVariantRequestDto {
+ @ApiProperty({ example: "asset_123" })
+ assetId!: string
+
+ @ApiProperty({ example: 4, minimum: 1 })
+ version!: number
+
+ @ApiProperty({ example: "card" })
+ preset!: string
+
+ @ApiProperty({ example: 640, minimum: 1 })
+ width!: number
+
+ @ApiProperty({ example: 80, minimum: 1 })
+ quality!: number
+
+ @ApiProperty({ enum: ["auto", "avif", "webp", "jpg", "png"], example: "auto" })
+ format!: "auto" | "avif" | "jpg" | "png" | "webp"
+}
diff --git a/apps/backend/src/internal-images/internal-images.controller.ts b/apps/backend/src/internal-images/internal-images.controller.ts
new file mode 100644
index 0000000..9216d7a
--- /dev/null
+++ b/apps/backend/src/internal-images/internal-images.controller.ts
@@ -0,0 +1,19 @@
+import { Body, Controller, NotImplementedException, Post } from "@nestjs/common"
+import { ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"
+
+import { EnsureImageVariantRequestDto } from "./ensure-image-variant.dto"
+
+@ApiTags("internal-images")
+@Controller("internal/images")
+export class InternalImagesController {
+ @Post("ensure")
+ @ApiOperation({ summary: "Ensure image variant for Gateway L1 miss" })
+ @ApiResponse({ status: 501, description: "Read-through image pipeline is not implemented yet" })
+ ensureImageVariant(@Body() request: EnsureImageVariantRequestDto): never {
+ throw new NotImplementedException({
+ message: "image read-through pipeline is not implemented yet",
+ request,
+ status: "not_implemented",
+ })
+ }
+}
diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts
new file mode 100644
index 0000000..bbc4dc2
--- /dev/null
+++ b/apps/backend/src/main.ts
@@ -0,0 +1,37 @@
+import { NestFactory } from "@nestjs/core"
+import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger"
+
+import { AppModule } from "./app.module"
+
+async function bootstrap() {
+ const app = await NestFactory.create(AppModule)
+
+ app.setGlobalPrefix("api")
+ app.enableShutdownHooks()
+
+ const openApiConfig = new DocumentBuilder()
+ .setTitle("Image Platform API")
+ .setDescription("Control plane for image assets, variants, S3 storage and external imgproxy.")
+ .setVersion("0.1.0")
+ .addTag("system")
+ .addTag("assets")
+ .addTag("variants")
+ .addTag("allowed-hosts")
+ .addTag("internal-images")
+ .build()
+
+ const openApiDocument = SwaggerModule.createDocument(app, openApiConfig)
+
+ SwaggerModule.setup("docs", app, openApiDocument, {
+ jsonDocumentUrl: "docs-json",
+ swaggerOptions: {
+ persistAuthorization: true,
+ },
+ })
+
+ const port = Number.parseInt(process.env.API_PORT ?? "3001", 10)
+
+ await app.listen(port)
+}
+
+void bootstrap()
diff --git a/apps/backend/tsconfig.build.json b/apps/backend/tsconfig.build.json
new file mode 100644
index 0000000..e79b11e
--- /dev/null
+++ b/apps/backend/tsconfig.build.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "declaration": true,
+ "noEmit": false
+ },
+ "exclude": ["node_modules", "dist", "test", "**/*.spec.ts"]
+}
diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json
new file mode 100644
index 0000000..c60455f
--- /dev/null
+++ b/apps/backend/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "baseUrl": "./",
+ "declaration": true,
+ "emitDecoratorMetadata": true,
+ "esModuleInterop": true,
+ "experimentalDecorators": true,
+ "incremental": true,
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "outDir": "./dist",
+ "removeComments": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "strictPropertyInitialization": false,
+ "target": "ES2023",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/apps/gateway/package.json b/apps/gateway/package.json
new file mode 100644
index 0000000..74ae64b
--- /dev/null
+++ b/apps/gateway/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "@image-platform/gateway",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "tsc -p tsconfig.build.json",
+ "dev": "tsx watch src/main.ts",
+ "start": "node dist/main.js",
+ "typecheck": "tsc --noEmit -p tsconfig.json"
+ },
+ "dependencies": {
+ "fastify": "^5.8.5"
+ },
+ "devDependencies": {
+ "@types/node": "^25.6.0",
+ "tsx": "^4.21.0",
+ "typescript": "^6.0.3"
+ }
+}
diff --git a/apps/gateway/src/config.ts b/apps/gateway/src/config.ts
new file mode 100644
index 0000000..5cad5e1
--- /dev/null
+++ b/apps/gateway/src/config.ts
@@ -0,0 +1,27 @@
+export type GatewayConfig = {
+ backendUpstream: URL
+ host: string
+ port: number
+}
+
+export function loadGatewayConfig(): GatewayConfig {
+ return {
+ backendUpstream: new URL(process.env.GATEWAY_BACKEND_UPSTREAM ?? "http://localhost:3001"),
+ host: process.env.GATEWAY_HOST ?? "0.0.0.0",
+ port: parsePort(process.env.GATEWAY_PORT, 8888),
+ }
+}
+
+function parsePort(value: string | undefined, fallback: number) {
+ if (!value) {
+ return fallback
+ }
+
+ const parsed = Number.parseInt(value, 10)
+
+ if (!Number.isFinite(parsed) || parsed < 1 || parsed > 65535) {
+ throw new Error(`Invalid port: ${value}`)
+ }
+
+ return parsed
+}
diff --git a/apps/gateway/src/main.ts b/apps/gateway/src/main.ts
new file mode 100644
index 0000000..f5999ed
--- /dev/null
+++ b/apps/gateway/src/main.ts
@@ -0,0 +1,12 @@
+import { loadGatewayConfig } from "./config.js"
+import { createGatewayServer } from "./server.js"
+
+const config = loadGatewayConfig()
+const app = createGatewayServer(config)
+
+try {
+ await app.listen({ host: config.host, port: config.port })
+} catch (error) {
+ app.log.error(error)
+ process.exit(1)
+}
diff --git a/apps/gateway/src/proxy.ts b/apps/gateway/src/proxy.ts
new file mode 100644
index 0000000..ada22ac
--- /dev/null
+++ b/apps/gateway/src/proxy.ts
@@ -0,0 +1,77 @@
+import { Readable } from "node:stream"
+
+import type { FastifyReply, FastifyRequest } from "fastify"
+
+const hopByHopHeaders = new Set([
+ "connection",
+ "keep-alive",
+ "proxy-authenticate",
+ "proxy-authorization",
+ "te",
+ "trailer",
+ "transfer-encoding",
+ "upgrade",
+])
+
+export async function proxyToUpstream(request: FastifyRequest, reply: FastifyReply, upstreamBaseUrl: URL) {
+ const upstreamUrl = new URL(request.url, upstreamBaseUrl)
+ const headers = buildProxyHeaders(request)
+ const init: RequestInit & { duplex?: "half" } = {
+ headers,
+ method: request.method,
+ redirect: "manual",
+ }
+
+ if (request.method !== "GET" && request.method !== "HEAD") {
+ init.body = request.raw as RequestInit["body"]
+ init.duplex = "half"
+ }
+
+ const response = await fetch(upstreamUrl, init)
+
+ reply.code(response.status)
+
+ response.headers.forEach((value, key) => {
+ if (!hopByHopHeaders.has(key.toLowerCase())) {
+ reply.header(key, value)
+ }
+ })
+
+ if (!response.body) {
+ return reply.send()
+ }
+
+ return reply.send(Readable.fromWeb(response.body))
+}
+
+function buildProxyHeaders(request: FastifyRequest) {
+ const headers = new Headers()
+
+ for (const [key, rawValue] of Object.entries(request.headers)) {
+ const lowerKey = key.toLowerCase()
+
+ if (lowerKey === "host" || hopByHopHeaders.has(lowerKey)) {
+ continue
+ }
+
+ if (Array.isArray(rawValue)) {
+ for (const value of rawValue) {
+ headers.append(key, value)
+ }
+ continue
+ }
+
+ if (typeof rawValue === "string") {
+ headers.set(key, rawValue)
+ }
+ }
+
+ headers.set("x-forwarded-host", request.headers.host ?? "")
+ headers.set("x-forwarded-proto", "http")
+
+ if (request.ip) {
+ headers.set("x-forwarded-for", request.ip)
+ }
+
+ return headers
+}
diff --git a/apps/gateway/src/server.ts b/apps/gateway/src/server.ts
new file mode 100644
index 0000000..e42235b
--- /dev/null
+++ b/apps/gateway/src/server.ts
@@ -0,0 +1,90 @@
+import Fastify from "fastify"
+
+import type { GatewayConfig } from "./config.js"
+import { proxyToUpstream } from "./proxy.js"
+
+export function createGatewayServer(config: GatewayConfig) {
+ const app = Fastify({
+ logger: true,
+ })
+
+ app.get("/health", async () => ({
+ service: "image-platform-gateway",
+ status: "ok",
+ }))
+
+ app.get<{ Params: ImageParams; Querystring: ImageQuery }>(
+ "/images/:assetId/:version/:preset",
+ async (request, reply) => {
+ const version = parseVersionParam(request.params.version)
+
+ if (version === null) {
+ return reply.code(400).send({
+ message: "image version must use v{number} format",
+ statusCode: 400,
+ })
+ }
+
+ const width = parseOptionalInteger(request.query.w)
+ const quality = parseOptionalInteger(request.query.q)
+ const format = request.query.f ?? "auto"
+
+ return reply.code(501).header("cache-control", "no-store").send({
+ assetId: request.params.assetId,
+ format,
+ message: "image gateway read-through pipeline is not implemented yet",
+ preset: request.params.preset,
+ quality,
+ status: "not_implemented",
+ version,
+ width,
+ })
+ },
+ )
+
+ app.all("/api/*", async (request, reply) => proxyToUpstream(request, reply, config.backendUpstream))
+ app.all("/docs", async (request, reply) => proxyToUpstream(request, reply, config.backendUpstream))
+ app.all("/docs/*", async (request, reply) => proxyToUpstream(request, reply, config.backendUpstream))
+ app.all("/docs-json", async (request, reply) => proxyToUpstream(request, reply, config.backendUpstream))
+
+ app.setNotFoundHandler(async (_request, reply) => {
+ return reply.code(404).send({
+ message: "route not found",
+ statusCode: 404,
+ })
+ })
+
+ return app
+}
+
+type ImageQuery = {
+ f?: string
+ q?: string
+ w?: string
+}
+
+type ImageParams = {
+ assetId: string
+ preset: string
+ version: string
+}
+
+function parseVersionParam(value: string) {
+ if (!value.startsWith("v")) {
+ return null
+ }
+
+ const parsed = Number.parseInt(value.slice(1), 10)
+
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null
+}
+
+function parseOptionalInteger(value: string | undefined) {
+ if (!value) {
+ return null
+ }
+
+ const parsed = Number.parseInt(value, 10)
+
+ return Number.isFinite(parsed) ? parsed : null
+}
diff --git a/apps/gateway/tsconfig.build.json b/apps/gateway/tsconfig.build.json
new file mode 100644
index 0000000..cc5774c
--- /dev/null
+++ b/apps/gateway/tsconfig.build.json
@@ -0,0 +1,6 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false
+ }
+}
diff --git a/apps/gateway/tsconfig.json b/apps/gateway/tsconfig.json
new file mode 100644
index 0000000..b056fc1
--- /dev/null
+++ b/apps/gateway/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["ES2023"],
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "noUncheckedIndexedAccess": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2023",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/apps/worker/package.json b/apps/worker/package.json
new file mode 100644
index 0000000..d155050
--- /dev/null
+++ b/apps/worker/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@image-platform/worker",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "tsc -p tsconfig.build.json",
+ "dev": "tsx watch src/main.ts",
+ "start": "node dist/main.js",
+ "typecheck": "tsc --noEmit -p tsconfig.json"
+ },
+ "dependencies": {
+ "@image-platform/database": "workspace:*",
+ "@image-platform/queue": "workspace:*",
+ "@image-platform/storage": "workspace:*",
+ "amqplib": "^1.0.4"
+ },
+ "devDependencies": {
+ "@types/amqplib": "^0.10.8",
+ "@types/node": "^25.6.0",
+ "tsx": "^4.21.0",
+ "typescript": "^6.0.3"
+ }
+}
diff --git a/apps/worker/src/config.ts b/apps/worker/src/config.ts
new file mode 100644
index 0000000..c2598ca
--- /dev/null
+++ b/apps/worker/src/config.ts
@@ -0,0 +1,25 @@
+import { loadQueueTopologyFromEnv, type QueueTopology } from "@image-platform/queue"
+
+export type WorkerConfig = {
+ prefetch: number
+ queueTopology: QueueTopology
+ rabbitmqUrl: string
+}
+
+export function loadWorkerConfig(env: NodeJS.ProcessEnv = process.env): WorkerConfig {
+ return {
+ prefetch: parsePositiveInteger(env.WORKER_PREFETCH, 2),
+ queueTopology: loadQueueTopologyFromEnv(env),
+ rabbitmqUrl: env.RABBITMQ_URL ?? "amqp://image:image-password@localhost:5672/image_platform",
+ }
+}
+
+function parsePositiveInteger(value: string | undefined, fallback: number) {
+ if (!value) {
+ return fallback
+ }
+
+ const parsed = Number.parseInt(value, 10)
+
+ return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback
+}
diff --git a/apps/worker/src/main.ts b/apps/worker/src/main.ts
new file mode 100644
index 0000000..7d6e091
--- /dev/null
+++ b/apps/worker/src/main.ts
@@ -0,0 +1,67 @@
+import amqp, { type Channel, type ConsumeMessage } from "amqplib"
+import { parseGenerateVariantJobBuffer, type QueueTopology } from "@image-platform/queue"
+
+import { loadWorkerConfig } from "./config.js"
+
+async function bootstrap() {
+ const config = loadWorkerConfig()
+ const connection = await amqp.connect(config.rabbitmqUrl)
+ const channel = await connection.createChannel()
+
+ await assertQueueTopology(channel, config.queueTopology)
+ await channel.prefetch(config.prefetch)
+ await channel.consume(
+ config.queueTopology.generateVariantQueue,
+ (message) => void handleGenerateVariantMessage(channel, message),
+ { noAck: false },
+ )
+
+ console.log(`worker consuming ${config.queueTopology.generateVariantQueue}`)
+
+ const shutdown = async () => {
+ console.log("worker shutting down")
+ await channel.close().catch((error: unknown) => console.error("failed to close RabbitMQ channel", error))
+ await connection.close().catch((error: unknown) => console.error("failed to close RabbitMQ connection", error))
+ process.exit(0)
+ }
+
+ process.once("SIGINT", () => void shutdown())
+ process.once("SIGTERM", () => void shutdown())
+}
+
+async function assertQueueTopology(channel: Channel, topology: QueueTopology) {
+ await channel.assertExchange(topology.jobsExchange, "direct", { durable: true })
+ await channel.assertExchange(topology.jobsDeadLetterExchange, "direct", { durable: true })
+ await channel.assertQueue(topology.generateVariantQueue, {
+ deadLetterExchange: topology.jobsDeadLetterExchange,
+ deadLetterRoutingKey: topology.generateVariantDeadLetterRoutingKey,
+ durable: true,
+ })
+ await channel.assertQueue(topology.generateVariantDeadLetterQueue, { durable: true })
+ await channel.bindQueue(topology.generateVariantQueue, topology.jobsExchange, topology.generateVariantRoutingKey)
+ await channel.bindQueue(
+ topology.generateVariantDeadLetterQueue,
+ topology.jobsDeadLetterExchange,
+ topology.generateVariantDeadLetterRoutingKey,
+ )
+}
+
+async function handleGenerateVariantMessage(channel: Channel, message: ConsumeMessage | null) {
+ if (message === null) {
+ return
+ }
+
+ try {
+ const job = parseGenerateVariantJobBuffer(message.content)
+ console.log("generate variant job received, handler not implemented yet", job)
+ channel.nack(message, false, false)
+ } catch (error) {
+ console.error("invalid generate variant job", error)
+ channel.nack(message, false, false)
+ }
+}
+
+void bootstrap().catch((error: unknown) => {
+ console.error("worker failed to start", error)
+ process.exit(1)
+})
diff --git a/apps/worker/tsconfig.build.json b/apps/worker/tsconfig.build.json
new file mode 100644
index 0000000..69b2412
--- /dev/null
+++ b/apps/worker/tsconfig.build.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false
+ },
+ "exclude": ["dist", "node_modules", "**/*.spec.ts"]
+}
diff --git a/apps/worker/tsconfig.json b/apps/worker/tsconfig.json
new file mode 100644
index 0000000..6bc598e
--- /dev/null
+++ b/apps/worker/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["ES2023"],
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "noUncheckedIndexedAccess": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2023",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/docs/api-contract-draft.md b/docs/api-contract-draft.md
deleted file mode 100644
index edcf4f6..0000000
--- a/docs/api-contract-draft.md
+++ /dev/null
@@ -1,124 +0,0 @@
-# Черновик API Контракта
-
-Это не реализация API, а фиксация будущего контракта для NestJS backend.
-
-Backend отдаёт JSON, metadata, statuses и URLs. Он не должен проксировать image bytes на каждый обычный запрос.
-
-## Allowed Hosts
-
-```text
-GET /allowed-hosts
-POST /allowed-hosts
-PATCH /allowed-hosts/:id
-DELETE /allowed-hosts/:id
-```
-
-## Assets
-
-```text
-GET /assets
-POST /assets
-GET /assets/:id
-DELETE /assets/:id
-```
-
-`POST /assets` request:
-
-```json
-{
- "sourceUrl": "https://example.com/photo.jpg"
-}
-```
-
-Responsibilities:
-
-- validate source URL;
-- check `allowed_image_hosts`;
-- create or reuse `image_assets` row;
-- optionally save original to S3 later.
-
-## Variants
-
-```text
-GET /assets/:id/variants
-POST /assets/:id/variants
-POST /variants/:id/regenerate
-DELETE /variants/:id
-```
-
-`POST /assets/:id/variants` request:
-
-```json
-{
- "preset": "card",
- "format": "webp",
- "width": 640
-}
-```
-
-Response if ready:
-
-```json
-{
- "id": "variant_123",
- "status": "ready",
- "url": "http://localhost:8888/images/asset_123/w640_q80_card.webp"
-}
-```
-
-Response if generation is async:
-
-```json
-{
- "id": "variant_123",
- "status": "pending",
- "url": null
-}
-```
-
-## Image URLs For UI
-
-Для UI нужен endpoint, который возвращает готовый набор URLs для ``/`srcset`.
-
-```text
-GET /assets/:id/picture?preset=card
-```
-
-Example response:
-
-```json
-{
- "assetId": "asset_123",
- "preset": "card",
- "sources": [
- {
- "type": "image/avif",
- "srcset": "http://localhost:8888/images/asset_123/w320_card.avif 320w, http://localhost:8888/images/asset_123/w640_card.avif 640w"
- },
- {
- "type": "image/webp",
- "srcset": "http://localhost:8888/images/asset_123/w320_card.webp 320w, http://localhost:8888/images/asset_123/w640_card.webp 640w"
- }
- ],
- "fallback": {
- "src": "http://localhost:8888/images/asset_123/w640_card.jpg",
- "width": 640,
- "height": null
- }
-}
-```
-
-## Worker Lifecycle
-
-Первый MVP может генерировать sync на request. Если генерация тяжёлая, variant создаётся как `pending`, а worker обрабатывает job.
-
-PostgreSQL может выступить первой очередью:
-
-```text
-SELECT * FROM image_variants
-WHERE status = 'pending'
-FOR UPDATE SKIP LOCKED
-LIMIT 1
-```
-
-Позже можно добавить Redis/Valkey или отдельную queue, если PostgreSQL станет узким местом.
diff --git a/docs/architecture.md b/docs/architecture.md
index b31c166..03f7e0f 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -12,24 +12,49 @@
|---|---|---|
| PostgreSQL | сейчас | Источник правды для assets, variants, hosts, statuses |
| S3/MinIO | сейчас | Хранилище originals и generated variants |
-| API | позже | JSON API, admin operations, validation, orchestration |
-| Worker | позже | Генерация variants, upload в S3, update PostgreSQL |
-| Admin UI | позже | Управление hosts/assets/variants/presets |
-| Gateway | позже | Caddy/Souin hot cache и delivery layer |
+| Backend | сейчас | NestJS JSON API, Swagger, PostgreSQL/S3/RabbitMQ orchestration |
+| Worker | позже | RabbitMQ consumer, imgproxy processing, upload в S3, update PostgreSQL |
+| Admin UI | сейчас | React/Vite UI для будущего управления hosts/assets/variants/presets |
+| Gateway | сейчас | Fastify public image origin, L1 memory cache, root routing, без DB/S3 доступа |
+| RabbitMQ | сейчас | Очередь задач генерации variants |
| imgproxy | external | CPU-heavy image processing |
+## Архитектурное решение
+
+Нужное поведение - Cloudinary-like: публичный URL изображения сам запускает read-through pipeline, если variant ещё не создан.
+
+`image-platform` строится ради совместимости с `next/image` как custom loader provider. Next.js application не должен заранее вызывать API, ждать генерацию и затем подставлять S3 URL. Он должен передавать `src`, `width` и `quality` в loader, а loader должен вернуть стабильный URL нашего image origin.
+
+Gateway поэтому является обязательной частью public delivery path, а не опциональным кешем.
+
## Целевая delivery схема
```text
client
-> CDN optional
--> gateway Caddy/Souin
--> S3 ready variant
--> generator fallback
+-> Fastify gateway L1 memory cache
+-> NestJS backend
+-> PostgreSQL + S3 ready variant
+-> RabbitMQ -> worker
-> external imgproxy
-> source image
```
+Read-through flow:
+
+```text
+1. client запрашивает /images/{assetId}/v{version}/{preset}?w=640&q=80&f=auto
+2. CDN HIT -> ответ сразу
+3. Gateway L1 HIT -> ответ сразу
+4. Gateway L1 MISS -> Gateway вызывает Backend internal ensure endpoint
+5. Backend проверяет PostgreSQL/S3
+6. S3 HIT -> Backend стримит bytes Gateway, Gateway кладёт ответ в L1
+7. S3 MISS -> Backend ставит RabbitMQ job
+8. Worker вызывает external imgproxy и сохраняет результат в S3
+9. Worker обновляет PostgreSQL, Backend отдаёт готовые bytes Gateway
+10. Gateway кладёт ответ в L1 и отдаёт клиенту
+```
+
## Разделение ответственности
PostgreSQL отвечает на вопросы:
@@ -49,29 +74,45 @@ S3 хранит байты:
Gateway отдаёт картинки:
-- hot cache HIT - сразу из Souin;
-- cache MISS - из S3;
-- S3 MISS - через generator fallback.
+- L1 memory HIT - сразу из памяти;
+- L1 memory MISS - вызывает Backend;
+- не имеет доступа к PostgreSQL, S3 и RabbitMQ.
-Backend не должен проксировать картинки на каждый обычный запрос. Он отдаёт JSON, статусы и URLs.
+Backend управляет процессами: PostgreSQL, S3 read, RabbitMQ enqueue, ожидание ready variant. Worker выполняет CPU-heavy generation через external imgproxy и пишет результат в S3.
## URL модель
-Публичные URL должны быть стабильными и не раскрывать source URL:
+Публичные URL должны быть стабильными и не раскрывать source URL. Для Next/image provider основной URL должен принимать width/quality из loader:
```text
-/images/{assetId}/{variantHash}.{format}
+/images/{assetId}/v{version}/{preset}?w={width}&q={quality}&f=auto
```
Примеры:
```text
-/images/asset_123/w640_q80_cfill.avif
-/images/asset_123/w640_q80_cfill.webp
-/images/asset_123/w640_q80_cfill.jpg
+/images/asset_123/v4/card?w=640&q=80&f=auto
+/images/asset_123/v4/hero?w=1920&q=80&f=auto
```
-Формат лучше делать явным в URL и отдавать через ``/`srcset`, а не выбирать по `Accept` header. Так CDN/S3/Gateway cache остаётся предсказуемым.
+`v{version}` берётся из `image_assets.current_version` и меняется при обновлении source image. Это даёт immutable cache без purge старых CDN/L1/S3 keys.
+
+`f=auto` нужен для совместимости с `next/image` custom loader: Next передаёт в loader `src`, `width` и `quality`, но не выбирает AVIF/WebP сам при custom loader. Image origin должен выбрать формат по `Accept` header, как Cloudinary `f_auto`.
+
+Из-за `f=auto` обязательно:
+
+- S3 key должен включать фактически выбранный формат;
+- response должен выставлять `Vary: Accept`;
+- CDN и Gateway L1 cache должны учитывать `Accept`;
+- response должен выставлять `Cache-Control: public, max-age=31536000, immutable` для versioned assets.
+
+Для ручного ``/`srcset` можно добавить явный формат позже:
+
+```text
+/images/{assetId}/v{version}/{preset}?w=640&q=80&f=avif
+/images/{assetId}/v{version}/{preset}?w=640&q=80&f=webp
+/images/{assetId}/v{version}/{preset}?w=640&q=80&f=jpg
+```
## External imgproxy
diff --git a/docs/backend-contract-draft.md b/docs/backend-contract-draft.md
new file mode 100644
index 0000000..5e8a705
--- /dev/null
+++ b/docs/backend-contract-draft.md
@@ -0,0 +1,224 @@
+# Черновик Backend Контракта
+
+Это черновик будущего бизнес-контракта для NestJS backend. Сейчас реализованы system endpoints, Swagger и placeholder для internal image ensure.
+
+## System
+
+```text
+GET /api/health
+GET /docs
+GET /docs-json
+```
+
+NestJS backend отдаёт JSON, metadata, statuses и URLs. Public image origin находится в Fastify Gateway. Backend владеет PostgreSQL, S3 orchestration и RabbitMQ jobs.
+
+## Internal Image Ensure
+
+Этот internal endpoint вызывается Gateway на L1 miss. Gateway не ходит в DB/S3 напрямую.
+
+```text
+POST /api/internal/images/ensure
+```
+
+Текущий статус реализации - endpoint зарезервирован и возвращает `501 Not Implemented`. Gateway `/images/*` пока тоже возвращает placeholder `501 Not Implemented`.
+
+Request body:
+
+```json
+{
+ "assetId": "asset_123",
+ "version": 4,
+ "preset": "card",
+ "width": 640,
+ "quality": 80,
+ "format": "webp"
+}
+```
+
+Query params:
+
+| Param | Описание |
+|---|---|
+| `w` | целевая ширина, должна быть разрешена preset или округлена до ближайшей разрешённой |
+| `q` | качество, должно быть из allowlist качества |
+| `f` | `auto`, `avif`, `webp`, `jpg`; для Next/image по умолчанию `auto` |
+
+Responsibilities:
+
+- проверить `assetId` и `preset`;
+- вычислить deterministic `variantHash`;
+- проверить PostgreSQL и S3;
+- если variant готов в S3, вернуть bytes или stream metadata для Gateway;
+- если variant отсутствует, создать/переиспользовать variant row;
+- поставить `generate-variant` job в RabbitMQ;
+- дождаться `ready` до timeout, чтобы первый `next/image` request мог получить картинку;
+- вернуть image response или metadata для Gateway.
+
+Response headers:
+
+```http
+Content-Type: image/avif | image/webp | image/jpeg
+Cache-Control: public, max-age=31536000, immutable
+Vary: Accept
+ETag: "..."
+```
+
+Ошибки:
+
+| Status | Когда |
+|---|---|
+| `400` | некорректные query params |
+| `404` | asset или preset не найден |
+| `409` | variant уже генерируется и sync ожидание отключено |
+| `422` | source image нельзя обработать |
+| `502` | external imgproxy недоступен |
+
+Public endpoint реализуется в Fastify Gateway, internal ensure endpoint - в Backend:
+
+```text
+client -> CDN -> Gateway /images/* -> Backend ensure -> RabbitMQ -> Worker -> imgproxy -> S3
+```
+
+Важно: `/images/*` не должен жить в NestJS `/api`. Gateway остаётся public image origin, Backend остаётся управлением процессов.
+Public image URL versioned: `/images/{assetId}/v{version}/{preset}?w={width}&q={quality}&f=auto`.
+
+## Allowed Hosts
+
+```text
+GET /allowed-hosts
+POST /allowed-hosts
+PATCH /allowed-hosts/:id
+DELETE /allowed-hosts/:id
+```
+
+## Assets
+
+```text
+GET /assets
+POST /assets
+GET /assets/:id
+DELETE /assets/:id
+```
+
+`POST /assets` request:
+
+```json
+{
+ "sourceUrl": "https://example.com/photo.jpg"
+}
+```
+
+Responsibilities:
+
+- validate source URL;
+- check `allowed_image_hosts`;
+- create or reuse `image_assets` row;
+- optionally save original to S3 later.
+
+## Variants
+
+```text
+GET /assets/:id/variants
+POST /assets/:id/variants
+POST /variants/:id/regenerate
+DELETE /variants/:id
+```
+
+`POST /assets/:id/variants` request:
+
+```json
+{
+ "preset": "card",
+ "format": "webp",
+ "width": 640
+}
+```
+
+Response if ready:
+
+```json
+{
+ "id": "variant_123",
+ "status": "ready",
+ "url": "http://localhost:8888/images/asset_123/v4/card?w=640&q=80&f=webp"
+}
+```
+
+Response if generation is async:
+
+```json
+{
+ "id": "variant_123",
+ "status": "pending",
+ "url": null
+}
+```
+
+## Image URLs For UI
+
+Для ручного UI можно добавить endpoint, который возвращает готовый набор URLs для ``/`srcset`. Для `next/image` основным контрактом остаётся custom loader из `docs/next-image-provider.md`.
+
+```text
+GET /assets/:id/picture?preset=card
+```
+
+Example response:
+
+```json
+{
+ "assetId": "asset_123",
+ "preset": "card",
+ "sources": [
+ {
+ "type": "image/avif",
+ "srcset": "http://localhost:8888/images/asset_123/v4/card?w=320&q=80&f=avif 320w, http://localhost:8888/images/asset_123/v4/card?w=640&q=80&f=avif 640w"
+ },
+ {
+ "type": "image/webp",
+ "srcset": "http://localhost:8888/images/asset_123/v4/card?w=320&q=80&f=webp 320w, http://localhost:8888/images/asset_123/v4/card?w=640&q=80&f=webp 640w"
+ }
+ ],
+ "fallback": {
+ "src": "http://localhost:8888/images/asset_123/v4/card?w=640&q=80&f=jpg",
+ "width": 640,
+ "height": null
+ }
+}
+```
+
+## Worker Lifecycle
+
+Worker выполняет задачи из RabbitMQ. Задачи создаёт Backend.
+
+RabbitMQ topology:
+
+```text
+exchange: image-platform.jobs
+queue: image.generate-variant
+dead-letter exchange: image-platform.jobs.dlx
+dead-letter queue: image.generate-variant.dlq
+```
+
+Job payload должен быть минимальным:
+
+```json
+{
+ "jobId": "job_123",
+ "variantId": "variant_123"
+}
+```
+
+Worker читает детали variant из PostgreSQL, вызывает imgproxy, пишет результат в S3 и обновляет status в PostgreSQL.
+
+Если генерация тяжёлая или не успела завершиться до timeout, Backend может вернуть Gateway `504`, а job продолжит выполняться/retry по очереди.
+
+PostgreSQL может выступить первой очередью:
+
+```text
+SELECT * FROM image_variants
+WHERE status = 'pending'
+FOR UPDATE SKIP LOCKED
+LIMIT 1
+```
+
+PostgreSQL-backed очередь не используется как основной механизм: для jobs выбран RabbitMQ.
diff --git a/docs/data-model.md b/docs/data-model.md
index 16ecc6e..6c268cf 100644
--- a/docs/data-model.md
+++ b/docs/data-model.md
@@ -1,16 +1,16 @@
-# Черновик Data Model
+# Data Model
-Это черновик для будущих миграций PostgreSQL. Реальные таблицы добавим вместе с API.
+Текущая PostgreSQL модель описана в `packages/database/src/schema.ts` и миграциях Drizzle в `packages/database/drizzle`.
## allowed_image_hosts
```text
-id
-hostname
-enabled
-description nullable
-created_at
-updated_at
+id uuid pk default gen_random_uuid()
+hostname text not null unique
+enabled boolean not null default true
+description text nullable
+created_at timestamptz not null default now()
+updated_at timestamptz not null default now()
```
Правила normalization:
@@ -26,53 +26,119 @@ updated_at
## image_assets
```text
-id
-source_url
-source_host
-source_hash
-original_s3_key nullable
-status
-width nullable
-height nullable
-content_type nullable
-size_bytes nullable
-created_at
-updated_at
+id uuid pk default gen_random_uuid()
+public_id text not null unique
+current_version integer not null default 1
+status asset_status not null default active
+created_at timestamptz not null default now()
+updated_at timestamptz not null default now()
```
+`public_id` - стабильный идентификатор в public URL. `current_version` указывает активную версию source image и используется для cache invalidation без purge.
+
+## image_asset_versions
+
+```text
+id uuid pk default gen_random_uuid()
+asset_id uuid not null references image_assets(id) on delete cascade
+version integer not null
+source_url text not null
+source_host text not null
+source_hash text not null
+original_s3_key text nullable
+width integer nullable
+height integer nullable
+content_type text nullable
+size_bytes bigint nullable
+created_at timestamptz not null default now()
+```
+
+Каждое изменение source image создаёт новую версию. Старые versioned URLs остаются immutable, новые клиенты получают URL с новым `v{version}`.
+
## image_variants
```text
-id
-asset_id
-preset
-variant_hash
-format
-width
-height nullable
-quality
-s3_key
-status: pending | processing | ready | failed
-size_bytes nullable
-error nullable
-created_at
-updated_at
-last_accessed_at nullable
+id uuid pk default gen_random_uuid()
+asset_id uuid not null references image_assets(id) on delete cascade
+asset_version_id uuid not null references image_asset_versions(id) on delete cascade
+asset_version integer not null
+preset text not null
+variant_hash text not null unique
+requested_format requested_format not null default auto
+format variant_format not null
+width integer not null
+height integer nullable
+quality integer not null
+s3_key text not null unique
+content_type text nullable
+etag text nullable
+status variant_status not null default pending
+size_bytes bigint nullable
+error text nullable
+attempt_count integer not null default 0
+last_accessed_at timestamptz nullable
+created_at timestamptz not null default now()
+updated_at timestamptz not null default now()
+```
+
+`requested_format` хранит то, что запросил клиент (`auto`, `avif`, `webp`, `jpg`, `png`). `format` хранит фактический output format после negotiation по `Accept`.
+
+## Enums
+
+```text
+asset_status: active | disabled | deleted
+requested_format: auto | avif | webp | jpg | png
+variant_format: avif | webp | jpg | png
+variant_status: pending | processing | ready | failed
```
## Unique constraints
```text
allowed_image_hosts(hostname)
-image_assets(source_hash)
-image_variants(asset_id, variant_hash, format)
+image_assets(public_id)
+image_asset_versions(asset_id, version)
+image_variants(asset_id, asset_version, preset, width, quality, format)
+image_variants(s3_key)
+image_variants(variant_hash)
+```
+
+Индексы:
+
+```text
+image_asset_versions(source_hash)
+image_variants(status)
```
## S3 layout
```text
-originals/{assetId}/source
-variants/{assetId}/{variantHash}.{format}
+originals/{assetId}/v{version}/source
+variants/{assetId}/v{version}/{variantHash}.{format}
+```
+
+`variantHash` должен включать:
+
+- `assetId`;
+- `assetVersion`;
+- `preset`;
+- normalized width;
+- normalized quality;
+- фактический output format;
+- параметры transform, влияющие на bytes.
+
+Для `f=auto` в public URL в S3 всё равно пишется фактический формат:
+
+```text
+variants/asset_123/v4/card_w640_q80_avif.avif
+variants/asset_123/v4/card_w640_q80_webp.webp
+variants/asset_123/v4/card_w640_q80_jpg.jpg
+```
+
+Public URL также versioned:
+
+```text
+/images/{assetId}/v{version}/{preset}?w={width}&q={quality}&f=auto
```
## Presets
diff --git a/docs/development.md b/docs/development.md
index a074c6a..bdc7d0f 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -2,15 +2,18 @@
## Принцип
-В Docker запускаем стабильную инфраструктуру. Кодовые сервисы позже запускаем нодой с hot reload.
+В Docker запускаем стабильную инфраструктуру. Кодовые сервисы запускаем нодой с hot reload.
Сейчас в Docker есть только:
- PostgreSQL;
- MinIO;
-- MinIO bucket init.
+- MinIO bucket init;
+- imgproxy dev instance;
+- RabbitMQ.
-`api`, `worker`, `admin` и `gateway` пока не созданы.
+`backend` уже создан как NestJS app. `admin` уже создан как чистый Vite React TS app. `gateway` уже создан как Fastify app. `worker` уже создан как RabbitMQ skeleton.
+Gateway обязателен для Cloudinary-like поведения и интеграции с `next/image`.
## Запуск инфраструктуры
@@ -45,40 +48,139 @@ pnpm infra:logs
| PostgreSQL | `localhost:5433` |
| MinIO API | `http://localhost:9000` |
| MinIO Console | `http://localhost:9001` |
+| imgproxy | `http://localhost:18080` |
+| RabbitMQ | `amqp://localhost:5672` |
+| RabbitMQ Management | `http://localhost:15672` |
+| Backend API | `http://localhost:3001/api` |
+| Swagger | `http://localhost:3001/docs` |
+| Admin | `http://localhost:5173` |
+| Gateway | `http://localhost:8888` |
+
+Если `localhost:8888` занят старым `image-gateway`, остановите старый stack или задайте `GATEWAY_PORT=8890` в `.env`.
+
+## Backend
+
+Запустить NestJS backend:
+
+```bash
+pnpm backend:dev
+```
+
+Проверки:
+
+```bash
+curl http://localhost:3001/api/health
+open http://localhost:3001/docs
+```
+
+## Database
+
+Drizzle schema живёт в `packages/database/src/schema.ts`, миграции - в `packages/database/drizzle`.
+
+Сгенерировать миграцию после изменения schema:
+
+```bash
+pnpm db:generate
+```
+
+Применить миграции к локальному PostgreSQL:
+
+```bash
+pnpm db:migrate
+```
+
+Открыть Drizzle Studio из корня проекта:
+
+```bash
+pnpm db:studio
+```
+
+Проверить database package:
+
+```bash
+pnpm db:typecheck
+pnpm db:build
+```
+
+## Admin
+
+Запустить React/Vite admin:
+
+```bash
+pnpm admin:dev
+```
+
+Открыть:
+
+```bash
+open http://localhost:5173
+```
+
+## Gateway
+
+Gateway запускается нодой:
+
+```bash
+pnpm gateway:dev
+```
+
+Проверить gateway health:
+
+```bash
+curl http://localhost:8888/health
+```
+
+Проверить placeholder image origin route:
+
+```bash
+curl -i "http://localhost:8888/images/asset_123/v4/card?w=640&q=80&f=auto"
+```
+
+Ожидаемый текущий статус - `501`, потому что S3/imgproxy генерация ещё не реализована.
+
+## Worker
+
+Worker запускается нодой и сейчас только объявляет RabbitMQ topology, слушает `image.generate-variant` и отправляет полученные jobs в DLQ, потому что генерация ещё не реализована.
+
+```bash
+pnpm worker:dev
+```
+
+Проверить worker package без запуска consumer:
+
+```bash
+pnpm worker:typecheck
+pnpm worker:build
+```
## Будущий dev flow
-Когда появятся приложения:
+Текущая и будущая схема:
```text
React/Vite admin localhost:5173
--> NestJS API localhost:3001
+-> NestJS backend localhost:3001
-> PostgreSQL localhost:5433
-> MinIO localhost:9000
+-> RabbitMQ localhost:5672
worker node process
-> PostgreSQL
-> MinIO
--> external imgproxy
+-> RabbitMQ
+-> imgproxy localhost:18080
-gateway Caddy/Souin localhost:8888
--> S3/MinIO ready variant
--> API/generator fallback on host.docker.internal:3001
+Fastify gateway localhost:8888
+-> L1 memory cache
+-> Backend internal ensure endpoint
```
-Для Linux gateway container должен видеть host services через:
+## imgproxy для разработки
-```yaml
-extra_hosts:
- - "host.docker.internal:host-gateway"
-```
-
-## External imgproxy для разработки
-
-`imgproxy` не входит в `image-platform` stack. Для локальной разработки можно использовать любой внешний endpoint и прописать его в `.env`:
+В dev compose поднимается локальный `imgproxy`, опубликованный только на `127.0.0.1:18080`:
```env
IMGPROXY_UPSTREAM=http://localhost:18080
```
-Если нужен локальный standalone imgproxy, его можно запустить отдельно вне этого compose stack. Он остаётся внешней зависимостью платформы.
+Для production `imgproxy` всё равно рассматривается как внешняя зависимость и может жить на отдельном мощном сервере.
diff --git a/docs/imgproxy-contract.md b/docs/imgproxy-contract.md
index fa2e494..2b573a9 100644
--- a/docs/imgproxy-contract.md
+++ b/docs/imgproxy-contract.md
@@ -63,7 +63,7 @@ Final signed URL:
## Security rules
- Не отдавать `IMGPROXY_KEY` и `IMGPROXY_SALT` в браузер.
-- Source URL валидировать в API/worker.
+- Source URL валидировать в Backend/worker.
- Разрешать только `http` и `https`.
- Запрещать localhost, private IP, loopback, link-local.
- Source host должен быть enabled в `allowed_image_hosts`.
diff --git a/docs/next-image-provider.md b/docs/next-image-provider.md
new file mode 100644
index 0000000..8589cc2
--- /dev/null
+++ b/docs/next-image-provider.md
@@ -0,0 +1,105 @@
+# Next/image Provider
+
+`image-platform` должен работать как custom image provider для `next/image`.
+
+## Next.js contract
+
+Next.js custom loader получает только:
+
+- `src`;
+- `width`;
+- `quality`.
+
+Поэтому public image URL должен принимать эти параметры напрямую и сам запускать read-through генерацию при miss.
+
+## Loader config
+
+В Next.js приложении используется `loaderFile`:
+
+```js
+// next.config.js
+module.exports = {
+ images: {
+ loader: "custom",
+ loaderFile: "./src/image-platform-loader.js",
+ qualities: [60, 75, 80, 90],
+ },
+}
+```
+
+Пример loader:
+
+```js
+"use client"
+
+const imageBaseUrl = process.env.NEXT_PUBLIC_IMAGE_PLATFORM_URL
+
+export default function imagePlatformLoader({ src, width, quality }) {
+ const normalizedSrc = src.startsWith("/") ? src.slice(1) : src
+ const q = quality || 80
+
+ return `${imageBaseUrl}/images/${normalizedSrc}?w=${width}&q=${q}&f=auto`
+}
+```
+
+Пример использования:
+
+```tsx
+import Image from "next/image"
+
+export function ProductCard() {
+ return
+}
+```
+
+## Public URL
+
+```text
+GET /images/{assetId}/v{version}/{preset}?w={width}&q={quality}&f=auto
+```
+
+Сейчас route уже зарезервирован в Fastify Gateway, но возвращает placeholder `501`, пока не реализованы PostgreSQL/S3/imgproxy read-through операции.
+
+Пример:
+
+```text
+https://img.example.com/images/asset_123/v4/card?w=640&q=80&f=auto
+```
+
+`src` не должен быть source URL. Это должен быть versioned platform identifier, например `asset_123/v4/card`. Source URL хранится в PostgreSQL и не раскрывается в public image URL.
+
+`v{version}` меняется при обновлении source image. Старые URL можно кэшировать как immutable без purge.
+
+## Format auto
+
+`f=auto` выбирает output format по `Accept` header:
+
+1. `image/avif`, если клиент поддерживает AVIF и preset разрешает AVIF.
+2. `image/webp`, если клиент поддерживает WebP и preset разрешает WebP.
+3. `image/jpeg` или original fallback.
+
+Для auto format обязательны headers:
+
+```http
+Vary: Accept
+Cache-Control: public, max-age=31536000, immutable
+Content-Type: image/avif | image/webp | image/jpeg
+```
+
+CDN и Gateway L1 cache должны учитывать `Vary: Accept`, иначе можно отдать AVIF клиенту без AVIF support.
+
+## Read-through behavior
+
+```text
+client -> CDN -> Fastify gateway -> L1 memory -> Backend -> RabbitMQ -> Worker -> imgproxy -> S3
+```
+
+Поведение:
+
+- CDN HIT: backend не вызывается.
+- Gateway L1 HIT: backend не вызывается.
+- Gateway L1 MISS: Gateway вызывает Backend internal ensure endpoint.
+- S3 HIT: Backend отдаёт bytes Gateway, Gateway кладёт result в L1.
+- S3 MISS: Backend ставит RabbitMQ job, Worker генерирует variant через external imgproxy, сохраняет в S3, обновляет PostgreSQL, Backend возвращает bytes Gateway.
+
+Так достигается Cloudinary-like поведение: первый запрос создаёт derived asset, следующие запросы отдаются из cache/storage.
diff --git a/infra/compose.dev.yml b/infra/compose.dev.yml
index d0495e9..1b38b4b 100644
--- a/infra/compose.dev.yml
+++ b/infra/compose.dev.yml
@@ -46,6 +46,33 @@ services:
mc anonymous set download local/$${S3_BUCKET}"
restart: "no"
+ imgproxy:
+ image: darthsim/imgproxy:latest
+ restart: unless-stopped
+ ports:
+ - "127.0.0.1:${IMGPROXY_PORT:-18080}:8080"
+ environment:
+ GODEBUG: http2client=0
+ IMGPROXY_KEY: ${IMGPROXY_KEY:-}
+ IMGPROXY_SALT: ${IMGPROXY_SALT:-}
+ IMGPROXY_WORKERS: ${IMGPROXY_WORKERS:-2}
+ IMGPROXY_MAX_SRC_RESOLUTION: ${IMGPROXY_MAX_SRC_RESOLUTION:-20}
+ IMGPROXY_USE_ETAG: "true"
+ IMGPROXY_ENABLE_VIDEO_THUMBNAILS: "false"
+ IMGPROXY_DOWNLOAD_TIMEOUT: ${IMGPROXY_DOWNLOAD_TIMEOUT:-30}
+ IMGPROXY_ALLOWED_SOURCES: ${IMGPROXY_ALLOWED_SOURCES:-}
+
+ rabbitmq:
+ image: rabbitmq:4-management-alpine
+ restart: unless-stopped
+ environment:
+ RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-image}
+ RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-image-password}
+ RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_DEFAULT_VHOST:-image_platform}
+ ports:
+ - "127.0.0.1:${RABBITMQ_PORT:-5672}:5672"
+ - "127.0.0.1:${RABBITMQ_MANAGEMENT_PORT:-15672}:15672"
+
volumes:
postgres-data:
minio-data:
diff --git a/package.json b/package.json
index 6ca5bfc..942048d 100644
--- a/package.json
+++ b/package.json
@@ -9,10 +9,35 @@
"pnpm": ">=10.0.0"
},
"scripts": {
+ "admin:build": "pnpm --filter @image-platform/admin build",
+ "admin:dev": "pnpm --filter @image-platform/admin dev",
+ "admin:preview": "pnpm --filter @image-platform/admin preview",
+ "admin:typecheck": "pnpm --filter @image-platform/admin typecheck",
+ "backend:build": "pnpm --filter @image-platform/backend build",
+ "backend:dev": "pnpm --filter @image-platform/backend dev",
+ "backend:start": "pnpm --filter @image-platform/backend start",
+ "backend:typecheck": "pnpm --filter @image-platform/backend typecheck",
+ "db:build": "pnpm --filter @image-platform/database build",
+ "db:generate": "pnpm --filter @image-platform/database db:generate",
+ "db:migrate": "pnpm --filter @image-platform/database db:migrate",
+ "db:studio": "pnpm --filter @image-platform/database db:studio",
+ "db:typecheck": "pnpm --filter @image-platform/database typecheck",
+ "gateway:build": "pnpm --filter @image-platform/gateway build",
+ "gateway:dev": "pnpm --filter @image-platform/gateway dev",
+ "gateway:start": "pnpm --filter @image-platform/gateway start",
+ "gateway:typecheck": "pnpm --filter @image-platform/gateway typecheck",
+ "queue:build": "pnpm --filter @image-platform/queue build",
+ "queue:typecheck": "pnpm --filter @image-platform/queue typecheck",
+ "storage:build": "pnpm --filter @image-platform/storage build",
+ "storage:typecheck": "pnpm --filter @image-platform/storage typecheck",
+ "worker:build": "pnpm db:build && pnpm queue:build && pnpm storage:build && pnpm --filter @image-platform/worker build",
+ "worker:dev": "pnpm db:build && pnpm queue:build && pnpm storage:build && pnpm --filter @image-platform/worker dev",
+ "worker:start": "pnpm --filter @image-platform/worker start",
+ "worker:typecheck": "pnpm --filter @image-platform/worker typecheck",
"infra:config": "docker compose -f infra/compose.dev.yml config",
"infra:up": "docker compose -f infra/compose.dev.yml up -d",
"infra:down": "docker compose -f infra/compose.dev.yml down",
"infra:logs": "docker compose -f infra/compose.dev.yml logs -f",
- "check": "pnpm infra:config"
+ "check": "pnpm infra:config && pnpm db:typecheck && pnpm queue:typecheck && pnpm storage:typecheck && pnpm backend:typecheck && pnpm admin:typecheck && pnpm gateway:typecheck && pnpm worker:typecheck"
}
}
diff --git a/packages/database/drizzle.config.ts b/packages/database/drizzle.config.ts
new file mode 100644
index 0000000..6c93611
--- /dev/null
+++ b/packages/database/drizzle.config.ts
@@ -0,0 +1,12 @@
+import { defineConfig } from "drizzle-kit"
+
+export default defineConfig({
+ dbCredentials: {
+ url: process.env.DATABASE_URL ?? "postgres://image:image-password@localhost:5433/image_platform",
+ },
+ dialect: "postgresql",
+ out: "./drizzle",
+ schema: "./src/schema.ts",
+ strict: true,
+ verbose: true,
+})
diff --git a/packages/database/drizzle/0000_calm_magdalene.sql b/packages/database/drizzle/0000_calm_magdalene.sql
new file mode 100644
index 0000000..0566cfe
--- /dev/null
+++ b/packages/database/drizzle/0000_calm_magdalene.sql
@@ -0,0 +1,72 @@
+CREATE TYPE "public"."asset_status" AS ENUM('active', 'disabled', 'deleted');--> statement-breakpoint
+CREATE TYPE "public"."requested_format" AS ENUM('auto', 'avif', 'webp', 'jpg', 'png');--> statement-breakpoint
+CREATE TYPE "public"."variant_format" AS ENUM('avif', 'webp', 'jpg', 'png');--> statement-breakpoint
+CREATE TYPE "public"."variant_status" AS ENUM('pending', 'processing', 'ready', 'failed');--> statement-breakpoint
+CREATE TABLE "allowed_image_hosts" (
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
+ "hostname" text NOT NULL,
+ "enabled" boolean DEFAULT true NOT NULL,
+ "description" text,
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "image_asset_versions" (
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
+ "asset_id" uuid NOT NULL,
+ "version" integer NOT NULL,
+ "source_url" text NOT NULL,
+ "source_host" text NOT NULL,
+ "source_hash" text NOT NULL,
+ "original_s3_key" text,
+ "width" integer,
+ "height" integer,
+ "content_type" text,
+ "size_bytes" bigint,
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "image_assets" (
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
+ "public_id" text NOT NULL,
+ "current_version" integer DEFAULT 1 NOT NULL,
+ "status" "asset_status" DEFAULT 'active' NOT NULL,
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
+);
+--> statement-breakpoint
+CREATE TABLE "image_variants" (
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
+ "asset_id" uuid NOT NULL,
+ "asset_version_id" uuid NOT NULL,
+ "asset_version" integer NOT NULL,
+ "preset" text NOT NULL,
+ "variant_hash" text NOT NULL,
+ "requested_format" "requested_format" DEFAULT 'auto' NOT NULL,
+ "format" "variant_format" NOT NULL,
+ "width" integer NOT NULL,
+ "height" integer,
+ "quality" integer NOT NULL,
+ "s3_key" text NOT NULL,
+ "content_type" text,
+ "etag" text,
+ "status" "variant_status" DEFAULT 'pending' NOT NULL,
+ "size_bytes" bigint,
+ "error" text,
+ "attempt_count" integer DEFAULT 0 NOT NULL,
+ "last_accessed_at" timestamp with time zone,
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL
+);
+--> statement-breakpoint
+ALTER TABLE "image_asset_versions" ADD CONSTRAINT "image_asset_versions_asset_id_image_assets_id_fk" FOREIGN KEY ("asset_id") REFERENCES "public"."image_assets"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "image_variants" ADD CONSTRAINT "image_variants_asset_id_image_assets_id_fk" FOREIGN KEY ("asset_id") REFERENCES "public"."image_assets"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+ALTER TABLE "image_variants" ADD CONSTRAINT "image_variants_asset_version_id_image_asset_versions_id_fk" FOREIGN KEY ("asset_version_id") REFERENCES "public"."image_asset_versions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
+CREATE UNIQUE INDEX "allowed_image_hosts_hostname_idx" ON "allowed_image_hosts" USING btree ("hostname");--> statement-breakpoint
+CREATE UNIQUE INDEX "image_asset_versions_asset_version_idx" ON "image_asset_versions" USING btree ("asset_id","version");--> statement-breakpoint
+CREATE INDEX "image_asset_versions_source_hash_idx" ON "image_asset_versions" USING btree ("source_hash");--> statement-breakpoint
+CREATE UNIQUE INDEX "image_assets_public_id_idx" ON "image_assets" USING btree ("public_id");--> statement-breakpoint
+CREATE UNIQUE INDEX "image_variants_lookup_idx" ON "image_variants" USING btree ("asset_id","asset_version","preset","width","quality","format");--> statement-breakpoint
+CREATE UNIQUE INDEX "image_variants_s3_key_idx" ON "image_variants" USING btree ("s3_key");--> statement-breakpoint
+CREATE UNIQUE INDEX "image_variants_variant_hash_idx" ON "image_variants" USING btree ("variant_hash");--> statement-breakpoint
+CREATE INDEX "image_variants_status_idx" ON "image_variants" USING btree ("status");
\ No newline at end of file
diff --git a/packages/database/drizzle/meta/0000_snapshot.json b/packages/database/drizzle/meta/0000_snapshot.json
new file mode 100644
index 0000000..8f719f6
--- /dev/null
+++ b/packages/database/drizzle/meta/0000_snapshot.json
@@ -0,0 +1,604 @@
+{
+ "id": "72292622-d326-46fe-8e6a-90096c7e6634",
+ "prevId": "00000000-0000-0000-0000-000000000000",
+ "version": "7",
+ "dialect": "postgresql",
+ "tables": {
+ "public.allowed_image_hosts": {
+ "name": "allowed_image_hosts",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "hostname": {
+ "name": "hostname",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "enabled": {
+ "name": "enabled",
+ "type": "boolean",
+ "primaryKey": false,
+ "notNull": true,
+ "default": true
+ },
+ "description": {
+ "name": "description",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "allowed_image_hosts_hostname_idx": {
+ "name": "allowed_image_hosts_hostname_idx",
+ "columns": [
+ {
+ "expression": "hostname",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.image_asset_versions": {
+ "name": "image_asset_versions",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "asset_id": {
+ "name": "asset_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "version": {
+ "name": "version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source_url": {
+ "name": "source_url",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source_host": {
+ "name": "source_host",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "source_hash": {
+ "name": "source_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "original_s3_key": {
+ "name": "original_s3_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "width": {
+ "name": "width",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "height": {
+ "name": "height",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "content_type": {
+ "name": "content_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "size_bytes": {
+ "name": "size_bytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "image_asset_versions_asset_version_idx": {
+ "name": "image_asset_versions_asset_version_idx",
+ "columns": [
+ {
+ "expression": "asset_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "version",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "image_asset_versions_source_hash_idx": {
+ "name": "image_asset_versions_source_hash_idx",
+ "columns": [
+ {
+ "expression": "source_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "image_asset_versions_asset_id_image_assets_id_fk": {
+ "name": "image_asset_versions_asset_id_image_assets_id_fk",
+ "tableFrom": "image_asset_versions",
+ "tableTo": "image_assets",
+ "columnsFrom": [
+ "asset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.image_assets": {
+ "name": "image_assets",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "public_id": {
+ "name": "public_id",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "current_version": {
+ "name": "current_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 1
+ },
+ "status": {
+ "name": "status",
+ "type": "asset_status",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'active'"
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "image_assets_public_id_idx": {
+ "name": "image_assets_public_id_idx",
+ "columns": [
+ {
+ "expression": "public_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {},
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ },
+ "public.image_variants": {
+ "name": "image_variants",
+ "schema": "",
+ "columns": {
+ "id": {
+ "name": "id",
+ "type": "uuid",
+ "primaryKey": true,
+ "notNull": true,
+ "default": "gen_random_uuid()"
+ },
+ "asset_id": {
+ "name": "asset_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "asset_version_id": {
+ "name": "asset_version_id",
+ "type": "uuid",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "asset_version": {
+ "name": "asset_version",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "preset": {
+ "name": "preset",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "variant_hash": {
+ "name": "variant_hash",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "requested_format": {
+ "name": "requested_format",
+ "type": "requested_format",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'auto'"
+ },
+ "format": {
+ "name": "format",
+ "type": "variant_format",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "width": {
+ "name": "width",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "height": {
+ "name": "height",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "quality": {
+ "name": "quality",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "s3_key": {
+ "name": "s3_key",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": true
+ },
+ "content_type": {
+ "name": "content_type",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "etag": {
+ "name": "etag",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "status": {
+ "name": "status",
+ "type": "variant_status",
+ "typeSchema": "public",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "'pending'"
+ },
+ "size_bytes": {
+ "name": "size_bytes",
+ "type": "bigint",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "error": {
+ "name": "error",
+ "type": "text",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "attempt_count": {
+ "name": "attempt_count",
+ "type": "integer",
+ "primaryKey": false,
+ "notNull": true,
+ "default": 0
+ },
+ "last_accessed_at": {
+ "name": "last_accessed_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": false
+ },
+ "created_at": {
+ "name": "created_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ },
+ "updated_at": {
+ "name": "updated_at",
+ "type": "timestamp with time zone",
+ "primaryKey": false,
+ "notNull": true,
+ "default": "now()"
+ }
+ },
+ "indexes": {
+ "image_variants_lookup_idx": {
+ "name": "image_variants_lookup_idx",
+ "columns": [
+ {
+ "expression": "asset_id",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "asset_version",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "preset",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "width",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "quality",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ },
+ {
+ "expression": "format",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "image_variants_s3_key_idx": {
+ "name": "image_variants_s3_key_idx",
+ "columns": [
+ {
+ "expression": "s3_key",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "image_variants_variant_hash_idx": {
+ "name": "image_variants_variant_hash_idx",
+ "columns": [
+ {
+ "expression": "variant_hash",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": true,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ },
+ "image_variants_status_idx": {
+ "name": "image_variants_status_idx",
+ "columns": [
+ {
+ "expression": "status",
+ "isExpression": false,
+ "asc": true,
+ "nulls": "last"
+ }
+ ],
+ "isUnique": false,
+ "concurrently": false,
+ "method": "btree",
+ "with": {}
+ }
+ },
+ "foreignKeys": {
+ "image_variants_asset_id_image_assets_id_fk": {
+ "name": "image_variants_asset_id_image_assets_id_fk",
+ "tableFrom": "image_variants",
+ "tableTo": "image_assets",
+ "columnsFrom": [
+ "asset_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ },
+ "image_variants_asset_version_id_image_asset_versions_id_fk": {
+ "name": "image_variants_asset_version_id_image_asset_versions_id_fk",
+ "tableFrom": "image_variants",
+ "tableTo": "image_asset_versions",
+ "columnsFrom": [
+ "asset_version_id"
+ ],
+ "columnsTo": [
+ "id"
+ ],
+ "onDelete": "cascade",
+ "onUpdate": "no action"
+ }
+ },
+ "compositePrimaryKeys": {},
+ "uniqueConstraints": {},
+ "policies": {},
+ "checkConstraints": {},
+ "isRLSEnabled": false
+ }
+ },
+ "enums": {
+ "public.asset_status": {
+ "name": "asset_status",
+ "schema": "public",
+ "values": [
+ "active",
+ "disabled",
+ "deleted"
+ ]
+ },
+ "public.requested_format": {
+ "name": "requested_format",
+ "schema": "public",
+ "values": [
+ "auto",
+ "avif",
+ "webp",
+ "jpg",
+ "png"
+ ]
+ },
+ "public.variant_format": {
+ "name": "variant_format",
+ "schema": "public",
+ "values": [
+ "avif",
+ "webp",
+ "jpg",
+ "png"
+ ]
+ },
+ "public.variant_status": {
+ "name": "variant_status",
+ "schema": "public",
+ "values": [
+ "pending",
+ "processing",
+ "ready",
+ "failed"
+ ]
+ }
+ },
+ "schemas": {},
+ "sequences": {},
+ "roles": {},
+ "policies": {},
+ "views": {},
+ "_meta": {
+ "columns": {},
+ "schemas": {},
+ "tables": {}
+ }
+}
\ No newline at end of file
diff --git a/packages/database/drizzle/meta/_journal.json b/packages/database/drizzle/meta/_journal.json
new file mode 100644
index 0000000..dfeb3fe
--- /dev/null
+++ b/packages/database/drizzle/meta/_journal.json
@@ -0,0 +1,13 @@
+{
+ "version": "7",
+ "dialect": "postgresql",
+ "entries": [
+ {
+ "idx": 0,
+ "version": "7",
+ "when": 1777963363578,
+ "tag": "0000_calm_magdalene",
+ "breakpoints": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/packages/database/package.json b/packages/database/package.json
new file mode 100644
index 0000000..3a0998d
--- /dev/null
+++ b/packages/database/package.json
@@ -0,0 +1,30 @@
+{
+ "name": "@image-platform/database",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./src/index.ts",
+ "default": "./dist/index.js"
+ }
+ },
+ "types": "./src/index.ts",
+ "scripts": {
+ "build": "tsc -p tsconfig.build.json",
+ "db:generate": "drizzle-kit generate --config drizzle.config.ts",
+ "db:migrate": "drizzle-kit migrate --config drizzle.config.ts",
+ "db:studio": "drizzle-kit studio --config drizzle.config.ts",
+ "typecheck": "tsc --noEmit -p tsconfig.json"
+ },
+ "dependencies": {
+ "drizzle-orm": "^0.45.2",
+ "pg": "^8.20.0"
+ },
+ "devDependencies": {
+ "@types/node": "^25.6.0",
+ "@types/pg": "^8.20.0",
+ "drizzle-kit": "^0.31.10",
+ "typescript": "^6.0.3"
+ }
+}
diff --git a/packages/database/src/client.ts b/packages/database/src/client.ts
new file mode 100644
index 0000000..ca76fe8
--- /dev/null
+++ b/packages/database/src/client.ts
@@ -0,0 +1,21 @@
+import { drizzle } from "drizzle-orm/node-postgres"
+import pg from "pg"
+
+import * as schema from "./schema.js"
+
+const { Pool } = pg
+
+export type DatabasePool = pg.Pool
+export type Database = ReturnType
+
+export function createDatabasePool(databaseUrl = process.env.DATABASE_URL) {
+ if (!databaseUrl) {
+ throw new Error("DATABASE_URL is required")
+ }
+
+ return new Pool({ connectionString: databaseUrl })
+}
+
+export function createDatabase(pool: DatabasePool) {
+ return drizzle(pool, { schema })
+}
diff --git a/packages/database/src/index.ts b/packages/database/src/index.ts
new file mode 100644
index 0000000..91179c5
--- /dev/null
+++ b/packages/database/src/index.ts
@@ -0,0 +1,2 @@
+export { createDatabase, createDatabasePool } from "./client.js"
+export * from "./schema.js"
diff --git a/packages/database/src/schema.ts b/packages/database/src/schema.ts
new file mode 100644
index 0000000..eb19c90
--- /dev/null
+++ b/packages/database/src/schema.ts
@@ -0,0 +1,113 @@
+import {
+ bigint,
+ boolean,
+ index,
+ integer,
+ pgEnum,
+ pgTable,
+ text,
+ timestamp,
+ uniqueIndex,
+ uuid,
+} from "drizzle-orm/pg-core"
+
+export const assetStatusEnum = pgEnum("asset_status", ["active", "disabled", "deleted"])
+export const variantFormatEnum = pgEnum("variant_format", ["avif", "webp", "jpg", "png"])
+export const requestedFormatEnum = pgEnum("requested_format", ["auto", "avif", "webp", "jpg", "png"])
+export const variantStatusEnum = pgEnum("variant_status", ["pending", "processing", "ready", "failed"])
+
+const timestamps = {
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
+}
+
+export const allowedImageHosts = pgTable(
+ "allowed_image_hosts",
+ {
+ id: uuid("id").primaryKey().defaultRandom(),
+ hostname: text("hostname").notNull(),
+ enabled: boolean("enabled").notNull().default(true),
+ description: text("description"),
+ ...timestamps,
+ },
+ (table) => [uniqueIndex("allowed_image_hosts_hostname_idx").on(table.hostname)],
+)
+
+export const imageAssets = pgTable(
+ "image_assets",
+ {
+ id: uuid("id").primaryKey().defaultRandom(),
+ publicId: text("public_id").notNull(),
+ currentVersion: integer("current_version").notNull().default(1),
+ status: assetStatusEnum("status").notNull().default("active"),
+ ...timestamps,
+ },
+ (table) => [uniqueIndex("image_assets_public_id_idx").on(table.publicId)],
+)
+
+export const imageAssetVersions = pgTable(
+ "image_asset_versions",
+ {
+ id: uuid("id").primaryKey().defaultRandom(),
+ assetId: uuid("asset_id")
+ .notNull()
+ .references(() => imageAssets.id, { onDelete: "cascade" }),
+ version: integer("version").notNull(),
+ sourceUrl: text("source_url").notNull(),
+ sourceHost: text("source_host").notNull(),
+ sourceHash: text("source_hash").notNull(),
+ originalS3Key: text("original_s3_key"),
+ width: integer("width"),
+ height: integer("height"),
+ contentType: text("content_type"),
+ sizeBytes: bigint("size_bytes", { mode: "number" }),
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
+ },
+ (table) => [
+ uniqueIndex("image_asset_versions_asset_version_idx").on(table.assetId, table.version),
+ index("image_asset_versions_source_hash_idx").on(table.sourceHash),
+ ],
+)
+
+export const imageVariants = pgTable(
+ "image_variants",
+ {
+ id: uuid("id").primaryKey().defaultRandom(),
+ assetId: uuid("asset_id")
+ .notNull()
+ .references(() => imageAssets.id, { onDelete: "cascade" }),
+ assetVersionId: uuid("asset_version_id")
+ .notNull()
+ .references(() => imageAssetVersions.id, { onDelete: "cascade" }),
+ assetVersion: integer("asset_version").notNull(),
+ preset: text("preset").notNull(),
+ variantHash: text("variant_hash").notNull(),
+ requestedFormat: requestedFormatEnum("requested_format").notNull().default("auto"),
+ format: variantFormatEnum("format").notNull(),
+ width: integer("width").notNull(),
+ height: integer("height"),
+ quality: integer("quality").notNull(),
+ s3Key: text("s3_key").notNull(),
+ contentType: text("content_type"),
+ etag: text("etag"),
+ status: variantStatusEnum("status").notNull().default("pending"),
+ sizeBytes: bigint("size_bytes", { mode: "number" }),
+ error: text("error"),
+ attemptCount: integer("attempt_count").notNull().default(0),
+ lastAccessedAt: timestamp("last_accessed_at", { withTimezone: true }),
+ ...timestamps,
+ },
+ (table) => [
+ uniqueIndex("image_variants_lookup_idx").on(
+ table.assetId,
+ table.assetVersion,
+ table.preset,
+ table.width,
+ table.quality,
+ table.format,
+ ),
+ uniqueIndex("image_variants_s3_key_idx").on(table.s3Key),
+ uniqueIndex("image_variants_variant_hash_idx").on(table.variantHash),
+ index("image_variants_status_idx").on(table.status),
+ ],
+)
diff --git a/packages/database/tsconfig.build.json b/packages/database/tsconfig.build.json
new file mode 100644
index 0000000..671b206
--- /dev/null
+++ b/packages/database/tsconfig.build.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false
+ },
+ "exclude": ["dist", "node_modules", "drizzle.config.ts"]
+}
diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json
new file mode 100644
index 0000000..6bc598e
--- /dev/null
+++ b/packages/database/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["ES2023"],
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "noUncheckedIndexedAccess": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2023",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/packages/queue/package.json b/packages/queue/package.json
new file mode 100644
index 0000000..8a1eab3
--- /dev/null
+++ b/packages/queue/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "@image-platform/queue",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./src/index.ts",
+ "default": "./dist/index.js"
+ }
+ },
+ "types": "./src/index.ts",
+ "scripts": {
+ "build": "tsc -p tsconfig.build.json",
+ "typecheck": "tsc --noEmit -p tsconfig.json"
+ },
+ "devDependencies": {
+ "@types/node": "^25.6.0",
+ "typescript": "^6.0.3"
+ }
+}
diff --git a/packages/queue/src/index.ts b/packages/queue/src/index.ts
new file mode 100644
index 0000000..f90efe6
--- /dev/null
+++ b/packages/queue/src/index.ts
@@ -0,0 +1,2 @@
+export * from "./jobs.js"
+export * from "./topology.js"
diff --git a/packages/queue/src/jobs.ts b/packages/queue/src/jobs.ts
new file mode 100644
index 0000000..e4cf95a
--- /dev/null
+++ b/packages/queue/src/jobs.ts
@@ -0,0 +1,37 @@
+export type GenerateVariantJob = {
+ jobId: string
+ variantId: string
+}
+
+export function parseGenerateVariantJobBuffer(buffer: Buffer): GenerateVariantJob {
+ const value = JSON.parse(buffer.toString("utf8")) as unknown
+
+ return parseGenerateVariantJob(value)
+}
+
+export function parseGenerateVariantJob(value: unknown): GenerateVariantJob {
+ if (!isRecord(value)) {
+ throw new Error("generate variant job must be a JSON object")
+ }
+
+ if (!isNonEmptyString(value.jobId)) {
+ throw new Error("generate variant job must include jobId")
+ }
+
+ if (!isNonEmptyString(value.variantId)) {
+ throw new Error("generate variant job must include variantId")
+ }
+
+ return {
+ jobId: value.jobId,
+ variantId: value.variantId,
+ }
+}
+
+function isRecord(value: unknown): value is Record {
+ return typeof value === "object" && value !== null && !Array.isArray(value)
+}
+
+function isNonEmptyString(value: unknown): value is string {
+ return typeof value === "string" && value.trim().length > 0
+}
diff --git a/packages/queue/src/topology.ts b/packages/queue/src/topology.ts
new file mode 100644
index 0000000..5f18a22
--- /dev/null
+++ b/packages/queue/src/topology.ts
@@ -0,0 +1,33 @@
+export type QueueTopology = {
+ generateVariantDeadLetterQueue: string
+ generateVariantDeadLetterRoutingKey: string
+ generateVariantQueue: string
+ generateVariantRoutingKey: string
+ jobsDeadLetterExchange: string
+ jobsExchange: string
+}
+
+export const DEFAULT_QUEUE_TOPOLOGY: QueueTopology = {
+ generateVariantDeadLetterQueue: "image.generate-variant.dlq",
+ generateVariantDeadLetterRoutingKey: "image.generate-variant.dlq",
+ generateVariantQueue: "image.generate-variant",
+ generateVariantRoutingKey: "image.generate-variant",
+ jobsDeadLetterExchange: "image-platform.jobs.dlx",
+ jobsExchange: "image-platform.jobs",
+}
+
+export function loadQueueTopologyFromEnv(env: NodeJS.ProcessEnv = process.env): QueueTopology {
+ const generateVariantQueue = env.RABBITMQ_GENERATE_VARIANT_QUEUE ?? DEFAULT_QUEUE_TOPOLOGY.generateVariantQueue
+ const generateVariantDeadLetterQueue =
+ env.RABBITMQ_GENERATE_VARIANT_DLQ ?? DEFAULT_QUEUE_TOPOLOGY.generateVariantDeadLetterQueue
+
+ return {
+ generateVariantDeadLetterQueue,
+ generateVariantDeadLetterRoutingKey:
+ env.RABBITMQ_GENERATE_VARIANT_DLQ_ROUTING_KEY ?? generateVariantDeadLetterQueue,
+ generateVariantQueue,
+ generateVariantRoutingKey: env.RABBITMQ_GENERATE_VARIANT_ROUTING_KEY ?? generateVariantQueue,
+ jobsDeadLetterExchange: env.RABBITMQ_GENERATE_VARIANT_DLX ?? DEFAULT_QUEUE_TOPOLOGY.jobsDeadLetterExchange,
+ jobsExchange: env.RABBITMQ_JOBS_EXCHANGE ?? DEFAULT_QUEUE_TOPOLOGY.jobsExchange,
+ }
+}
diff --git a/packages/queue/tsconfig.build.json b/packages/queue/tsconfig.build.json
new file mode 100644
index 0000000..69b2412
--- /dev/null
+++ b/packages/queue/tsconfig.build.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false
+ },
+ "exclude": ["dist", "node_modules", "**/*.spec.ts"]
+}
diff --git a/packages/queue/tsconfig.json b/packages/queue/tsconfig.json
new file mode 100644
index 0000000..6bc598e
--- /dev/null
+++ b/packages/queue/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["ES2023"],
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "noUncheckedIndexedAccess": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2023",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/packages/storage/package.json b/packages/storage/package.json
new file mode 100644
index 0000000..bc753a9
--- /dev/null
+++ b/packages/storage/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@image-platform/storage",
+ "version": "0.1.0",
+ "private": true,
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./src/index.ts",
+ "default": "./dist/index.js"
+ }
+ },
+ "types": "./src/index.ts",
+ "scripts": {
+ "build": "tsc -p tsconfig.build.json",
+ "typecheck": "tsc --noEmit -p tsconfig.json"
+ },
+ "dependencies": {
+ "@aws-sdk/client-s3": "^3.1042.0"
+ },
+ "devDependencies": {
+ "@types/node": "^25.6.0",
+ "typescript": "^6.0.3"
+ }
+}
diff --git a/packages/storage/src/client.ts b/packages/storage/src/client.ts
new file mode 100644
index 0000000..edadf96
--- /dev/null
+++ b/packages/storage/src/client.ts
@@ -0,0 +1,20 @@
+import { S3Client, type S3ClientConfig } from "@aws-sdk/client-s3"
+
+import type { StorageConfig } from "./config.js"
+
+export function createS3Client(config: StorageConfig) {
+ const clientConfig: S3ClientConfig = {
+ endpoint: config.endpoint,
+ forcePathStyle: config.forcePathStyle,
+ region: config.region,
+ }
+
+ if (config.accessKeyId && config.secretAccessKey) {
+ clientConfig.credentials = {
+ accessKeyId: config.accessKeyId,
+ secretAccessKey: config.secretAccessKey,
+ }
+ }
+
+ return new S3Client(clientConfig)
+}
diff --git a/packages/storage/src/config.ts b/packages/storage/src/config.ts
new file mode 100644
index 0000000..01d7bfe
--- /dev/null
+++ b/packages/storage/src/config.ts
@@ -0,0 +1,31 @@
+export type StorageConfig = {
+ accessKeyId?: string
+ bucket: string
+ endpoint?: string
+ forcePathStyle: boolean
+ region: string
+ secretAccessKey?: string
+}
+
+export function loadStorageConfigFromEnv(env: NodeJS.ProcessEnv = process.env): StorageConfig {
+ return {
+ accessKeyId: normalizeOptionalString(env.S3_ACCESS_KEY_ID),
+ bucket: env.S3_BUCKET ?? "image-platform",
+ endpoint: normalizeOptionalString(env.S3_ENDPOINT),
+ forcePathStyle: parseBoolean(env.S3_FORCE_PATH_STYLE, true),
+ region: env.S3_REGION ?? "us-east-1",
+ secretAccessKey: normalizeOptionalString(env.S3_SECRET_ACCESS_KEY),
+ }
+}
+
+function normalizeOptionalString(value: string | undefined) {
+ return value && value.trim().length > 0 ? value : undefined
+}
+
+function parseBoolean(value: string | undefined, fallback: boolean) {
+ if (value === undefined) {
+ return fallback
+ }
+
+ return ["1", "true", "yes"].includes(value.toLowerCase())
+}
diff --git a/packages/storage/src/index.ts b/packages/storage/src/index.ts
new file mode 100644
index 0000000..f220915
--- /dev/null
+++ b/packages/storage/src/index.ts
@@ -0,0 +1,3 @@
+export * from "./client.js"
+export * from "./config.js"
+export * from "./keys.js"
diff --git a/packages/storage/src/keys.ts b/packages/storage/src/keys.ts
new file mode 100644
index 0000000..aa86e49
--- /dev/null
+++ b/packages/storage/src/keys.ts
@@ -0,0 +1,40 @@
+export type VariantFormat = "avif" | "jpg" | "png" | "webp"
+
+export type OriginalImageKeyInput = {
+ assetId: string
+ version: number
+}
+
+export type VariantImageKeyInput = OriginalImageKeyInput & {
+ format: VariantFormat
+ variantHash: string
+}
+
+export function buildOriginalImageKey(input: OriginalImageKeyInput) {
+ return `originals/${safeSegment(input.assetId, "assetId")}/v${safeVersion(input.version)}/source`
+}
+
+export function buildVariantImageKey(input: VariantImageKeyInput) {
+ return [
+ "variants",
+ safeSegment(input.assetId, "assetId"),
+ `v${safeVersion(input.version)}`,
+ `${safeSegment(input.variantHash, "variantHash")}.${input.format}`,
+ ].join("/")
+}
+
+function safeSegment(value: string, name: string) {
+ if (value.length === 0 || value.includes("/")) {
+ throw new Error(`${name} must be a non-empty S3 key segment`)
+ }
+
+ return value
+}
+
+function safeVersion(value: number) {
+ if (!Number.isSafeInteger(value) || value < 1) {
+ throw new Error("version must be a positive integer")
+ }
+
+ return value
+}
diff --git a/packages/storage/tsconfig.build.json b/packages/storage/tsconfig.build.json
new file mode 100644
index 0000000..69b2412
--- /dev/null
+++ b/packages/storage/tsconfig.build.json
@@ -0,0 +1,7 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": false
+ },
+ "exclude": ["dist", "node_modules", "**/*.spec.ts"]
+}
diff --git a/packages/storage/tsconfig.json b/packages/storage/tsconfig.json
new file mode 100644
index 0000000..6bc598e
--- /dev/null
+++ b/packages/storage/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "lib": ["ES2023"],
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "noUncheckedIndexedAccess": true,
+ "outDir": "./dist",
+ "rootDir": "./src",
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "target": "ES2023",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts"],
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9b60ae1..c6b1151 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,3 +7,5982 @@ settings:
importers:
.: {}
+
+ apps/admin:
+ dependencies:
+ react:
+ specifier: ^19.2.5
+ version: 19.2.5
+ react-dom:
+ specifier: ^19.2.5
+ version: 19.2.5(react@19.2.5)
+ devDependencies:
+ '@types/node':
+ specifier: ^24.12.2
+ version: 24.12.2
+ '@types/react':
+ specifier: ^19.2.14
+ version: 19.2.14
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.14)
+ '@vitejs/plugin-react':
+ specifier: ^6.0.1
+ version: 6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(terser@5.46.2)(tsx@4.21.0))
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+ vite:
+ specifier: ^8.0.10
+ version: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(terser@5.46.2)(tsx@4.21.0)
+
+ apps/backend:
+ dependencies:
+ '@nestjs/common':
+ specifier: ^11.0.0
+ version: 11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core':
+ specifier: ^11.0.0
+ version: 11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/platform-express':
+ specifier: ^11.0.0
+ version: 11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)
+ '@nestjs/swagger':
+ specifier: ^11.0.0
+ version: 11.4.2(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)
+ reflect-metadata:
+ specifier: ^0.2.2
+ version: 0.2.2
+ rxjs:
+ specifier: ^7.8.1
+ version: 7.8.2
+ swagger-ui-express:
+ specifier: ^5.0.1
+ version: 5.0.1(express@5.2.1)
+ devDependencies:
+ '@nestjs/cli':
+ specifier: ^11.0.0
+ version: 11.0.21(@types/node@24.12.2)
+ '@nestjs/schematics':
+ specifier: ^11.0.0
+ version: 11.1.0(chokidar@4.0.3)(typescript@5.9.3)
+ '@types/node':
+ specifier: ^24.0.0
+ version: 24.12.2
+ '@types/swagger-ui-express':
+ specifier: ^4.1.8
+ version: 4.1.8
+ typescript:
+ specifier: ^5.9.0
+ version: 5.9.3
+
+ apps/gateway:
+ dependencies:
+ fastify:
+ specifier: ^5.8.5
+ version: 5.8.5
+ devDependencies:
+ '@types/node':
+ specifier: ^25.6.0
+ version: 25.6.0
+ tsx:
+ specifier: ^4.21.0
+ version: 4.21.0
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+
+ apps/worker:
+ dependencies:
+ '@image-platform/database':
+ specifier: workspace:*
+ version: link:../../packages/database
+ '@image-platform/queue':
+ specifier: workspace:*
+ version: link:../../packages/queue
+ '@image-platform/storage':
+ specifier: workspace:*
+ version: link:../../packages/storage
+ amqplib:
+ specifier: ^1.0.4
+ version: 1.0.4
+ devDependencies:
+ '@types/amqplib':
+ specifier: ^0.10.8
+ version: 0.10.8
+ '@types/node':
+ specifier: ^25.6.0
+ version: 25.6.0
+ tsx:
+ specifier: ^4.21.0
+ version: 4.21.0
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+
+ packages/database:
+ dependencies:
+ drizzle-orm:
+ specifier: ^0.45.2
+ version: 0.45.2(@types/pg@8.20.0)(pg@8.20.0)
+ pg:
+ specifier: ^8.20.0
+ version: 8.20.0
+ devDependencies:
+ '@types/node':
+ specifier: ^25.6.0
+ version: 25.6.0
+ '@types/pg':
+ specifier: ^8.20.0
+ version: 8.20.0
+ drizzle-kit:
+ specifier: ^0.31.10
+ version: 0.31.10
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+
+ packages/queue:
+ devDependencies:
+ '@types/node':
+ specifier: ^25.6.0
+ version: 25.6.0
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+
+ packages/storage:
+ dependencies:
+ '@aws-sdk/client-s3':
+ specifier: ^3.1042.0
+ version: 3.1042.0
+ devDependencies:
+ '@types/node':
+ specifier: ^25.6.0
+ version: 25.6.0
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+
+packages:
+
+ '@angular-devkit/core@19.2.24':
+ resolution: {integrity: sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ peerDependencies:
+ chokidar: ^4.0.0
+ peerDependenciesMeta:
+ chokidar:
+ optional: true
+
+ '@angular-devkit/schematics-cli@19.2.24':
+ resolution: {integrity: sha512-bsStZQG67J1HBqTmWxtIcobvgrn32L4UOdL7hGyOru5VxDWPNA8pRnDYavT3hnJeBkJYPoQIw8u7Dm0ecoQprw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ hasBin: true
+
+ '@angular-devkit/schematics@19.2.24':
+ resolution: {integrity: sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==}
+ engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+
+ '@aws-crypto/crc32@5.2.0':
+ resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==}
+ engines: {node: '>=16.0.0'}
+
+ '@aws-crypto/crc32c@5.2.0':
+ resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==}
+
+ '@aws-crypto/sha1-browser@5.2.0':
+ resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==}
+
+ '@aws-crypto/sha256-browser@5.2.0':
+ resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==}
+
+ '@aws-crypto/sha256-js@5.2.0':
+ resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==}
+ engines: {node: '>=16.0.0'}
+
+ '@aws-crypto/supports-web-crypto@5.2.0':
+ resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==}
+
+ '@aws-crypto/util@5.2.0':
+ resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
+
+ '@aws-sdk/client-s3@3.1042.0':
+ resolution: {integrity: sha512-z3Ibstr7ckDT10dz/nkk4+93LitrrO49Oq563/JoFHt30ZNodPBCfSxysKcelLyi/lNVF1MZrhZZfikUAG3iNQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/core@3.974.8':
+ resolution: {integrity: sha512-njR2qoG6ZuB0kvAS2FyICsFZJ6gmCcf2X/7JcD14sUvGDm26wiZ5BrA6LOiUxKFEF+IVe7kdroxyE00YlkiYsw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/crc64-nvme@3.972.7':
+ resolution: {integrity: sha512-QUagVVBbC8gODCF6e1aV0mE2TXWB9Opz4k8EJFdNrujUVQm5R4AjJa1mpOqzwOuROBzqJU9zawzig7M96L8Ejg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-env@3.972.34':
+ resolution: {integrity: sha512-XT0jtf8Fw9JE6ppsQeoNnZRiG+jqRixMT1v1ZR17G60UvVdsQmTG8nbEyHuEPfMxDXEhfdARaM/XiEhca4lGHQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-http@3.972.36':
+ resolution: {integrity: sha512-DPoGWfy7J7RKxvbf5kOKIGQkD2ek3dbKgzKIGrnLuvZBz5myU+Im/H6pmc14QcnFbqHMqxvtWSgRDSJW3qXLQg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-ini@3.972.38':
+ resolution: {integrity: sha512-oDzUBu2MGJFgoar05sPMCwSrhw44ASyccrHzj66vO69OZqi7I6hZZxXfuPLC8OCzW7C+sU+bI73XHij41yekgQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-login@3.972.38':
+ resolution: {integrity: sha512-g1NosS8qe4OF++G2UFCM5ovSkgipC7YYor5KCWatG0UoMSO5YFj9C8muePlyVmOBV/WTI16Jo3/s1NUo/o1Bww==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-node@3.972.39':
+ resolution: {integrity: sha512-HEswDQyxUtadoZ/bJsPPENHg7R0Lzym5LuMksJeHvqhCOpP+rtkDLKI4/ZChH4w3cf5kG8n6bZuI8PzajoiqMg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-process@3.972.34':
+ resolution: {integrity: sha512-T3IFs4EVmVi1dVN5RciFnklCANSzvrQd/VuHY9ThHSQmYkTogjcGkoJEr+oNUPQZnso52183088NqysMPji1/Q==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-sso@3.972.38':
+ resolution: {integrity: sha512-5ZxG+t0+3Q3QPh8KEjX6syskhgNf7I0MN7oGioTf6Lm1NTjfP7sIcYGNsthXC2qR8vcD3edNZwCr2ovfSSWuRA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/credential-provider-web-identity@3.972.38':
+ resolution: {integrity: sha512-lYHFF30DGI20jZcYX8cm6Ns0V7f1dDN6g/MBDLTyD/5iw+bXs3yBr2iAiHDkx4RFU5JgsnZvCHYKiRVPRdmOgw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-bucket-endpoint@3.972.10':
+ resolution: {integrity: sha512-Vbc2frZH7wXlMNd+ZZSXUEs/l1Sv8Jj4zUnIfwrYF5lwaLdXHZ9xx4U3rjUcaye3HRhFVc+E5DbBxpRAbB16BA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-expect-continue@3.972.10':
+ resolution: {integrity: sha512-2Yn0f1Qiq/DjxYR3wfI3LokXnjOhFM7Ssn4LTdFDIxRMCE6I32MAsVnhPX1cUZsuVA9tiZtwwhlSLAtFGxAZlQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-flexible-checksums@3.974.16':
+ resolution: {integrity: sha512-6ru8doI0/XzszqLIPXf0E/V7HhAw1Pu94010XCKYtBUfD0LxF0BuOzrUf8OQGR6j2o6wgKTHUniOmndQycHwCA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-host-header@3.972.10':
+ resolution: {integrity: sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-location-constraint@3.972.10':
+ resolution: {integrity: sha512-rI3NZvJcEvjoD0+0PI0iUAwlPw2IlSlhyvgBK/3WkKJQE/YiKFedd9dMN2lVacdNxPNhxL/jzQaKQdrGtQagjQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-logger@3.972.10':
+ resolution: {integrity: sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-recursion-detection@3.972.11':
+ resolution: {integrity: sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-sdk-s3@3.972.37':
+ resolution: {integrity: sha512-Km7M+i8DrLArVzrid1gfxeGhYHBd3uxvE77g0s5a52zPSVosxzQBnJ0gwWb6NIp/DOk8gsBMhi7V+cpJG0ndTA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-ssec@3.972.10':
+ resolution: {integrity: sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/middleware-user-agent@3.972.38':
+ resolution: {integrity: sha512-iz+B29TXcAZsJpwB+AwG/TTGA5l/VnmMZ2UxtiySOZjI6gCdmviXPwdgzcmuazMy16rXoPY4mYCGe7zdNKfx5A==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/nested-clients@3.997.6':
+ resolution: {integrity: sha512-WBDnqatJl+kGObpfmfSxqnXeYTu3Me8wx8WCtvoxX3pfWrrTv8I4WTMSSs7PZqcRcVh8WeUKMgGFjMG+52SR1w==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/region-config-resolver@3.972.13':
+ resolution: {integrity: sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/signature-v4-multi-region@3.996.25':
+ resolution: {integrity: sha512-+CMIt3e1VzlklAECmG+DtP1sV8iKq25FuA0OKpnJ4KA0kxUtd7CgClY7/RU6VzJBQwbN4EJ9Ue6plvqx1qGadw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/token-providers@3.1041.0':
+ resolution: {integrity: sha512-Th7kPI6YPtvJUcdznooXJMy+9rQWjmEF81LxaJssngBzuysK4a/x+l8kjm1zb7nYsUPbndnBdUnwng/3PLvtGw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/types@3.973.8':
+ resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-arn-parser@3.972.3':
+ resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-endpoints@3.996.8':
+ resolution: {integrity: sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-locate-window@3.965.5':
+ resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws-sdk/util-user-agent-browser@3.972.10':
+ resolution: {integrity: sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==}
+
+ '@aws-sdk/util-user-agent-node@3.973.24':
+ resolution: {integrity: sha512-ZWwlkjcIp7cEL8ZfTpTAPNkwx25p7xol0xlKoWVVf22+nsjwmLcHYtTPjIV1cSpmB/b6DaK4cb1fSkvCXHgRdw==}
+ engines: {node: '>=20.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+
+ '@aws-sdk/xml-builder@3.972.22':
+ resolution: {integrity: sha512-PMYKKtJd70IsSG0yHrdAbxBr+ZWBKLvzFZfD3/urxgf6hXVMzuU5M+3MJ5G67RpOmLBu1fAUN65SbWuKUCOlAA==}
+ engines: {node: '>=20.0.0'}
+
+ '@aws/lambda-invoke-store@0.2.4':
+ resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@babel/code-frame@7.29.0':
+ resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
+ '@borewit/text-codec@0.2.2':
+ resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==}
+
+ '@colors/colors@1.5.0':
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+
+ '@drizzle-team/brocli@0.10.2':
+ resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
+
+ '@emnapi/core@1.10.0':
+ resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
+
+ '@emnapi/runtime@1.10.0':
+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
+
+ '@emnapi/wasi-threads@1.2.1':
+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
+
+ '@esbuild-kit/core-utils@3.3.2':
+ resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==}
+ deprecated: 'Merged into tsx: https://tsx.is'
+
+ '@esbuild-kit/esm-loader@2.6.5':
+ resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==}
+ deprecated: 'Merged into tsx: https://tsx.is'
+
+ '@esbuild/aix-ppc64@0.25.12':
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/aix-ppc64@0.27.7':
+ resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.18.20':
+ resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.25.12':
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm64@0.27.7':
+ resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.18.20':
+ resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.25.12':
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-arm@0.27.7':
+ resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.18.20':
+ resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.25.12':
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/android-x64@0.27.7':
+ resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.18.20':
+ resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.25.12':
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-arm64@0.27.7':
+ resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.18.20':
+ resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.25.12':
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.27.7':
+ resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.18.20':
+ resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-arm64@0.27.7':
+ resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.18.20':
+ resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.25.12':
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.27.7':
+ resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.18.20':
+ resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.25.12':
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm64@0.27.7':
+ resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.18.20':
+ resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.25.12':
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.27.7':
+ resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.18.20':
+ resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.25.12':
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.27.7':
+ resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.18.20':
+ resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.25.12':
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.27.7':
+ resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.18.20':
+ resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.25.12':
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.27.7':
+ resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.18.20':
+ resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.25.12':
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.27.7':
+ resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.18.20':
+ resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.25.12':
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.27.7':
+ resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.18.20':
+ resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.25.12':
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.27.7':
+ resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.18.20':
+ resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.25.12':
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.7':
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.18.20':
+ resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.25.12':
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.7':
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.18.20':
+ resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.25.12':
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.7':
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.18.20':
+ resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.25.12':
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.27.7':
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.18.20':
+ resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.25.12':
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.27.7':
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.18.20':
+ resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.25.12':
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.7':
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.18.20':
+ resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.25.12':
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.7':
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@fastify/ajv-compiler@4.0.5':
+ resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==}
+
+ '@fastify/error@4.2.0':
+ resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==}
+
+ '@fastify/fast-json-stringify-compiler@5.0.3':
+ resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==}
+
+ '@fastify/forwarded@3.0.1':
+ resolution: {integrity: sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==}
+
+ '@fastify/merge-json-schemas@0.2.1':
+ resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==}
+
+ '@fastify/proxy-addr@5.1.0':
+ resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==}
+
+ '@inquirer/ansi@1.0.2':
+ resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/checkbox@4.3.2':
+ resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/confirm@5.1.21':
+ resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/core@10.3.2':
+ resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/editor@4.2.23':
+ resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/expand@4.0.23':
+ resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/figures@1.0.15':
+ resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.3.1':
+ resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/number@3.0.23':
+ resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/password@4.0.23':
+ resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.10.1':
+ resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/prompts@7.3.2':
+ resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/rawlist@4.1.11':
+ resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/search@3.2.2':
+ resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/select@4.4.2':
+ resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@inquirer/type@3.0.10':
+ resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@lukeed/csprng@1.1.0':
+ resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==}
+ engines: {node: '>=8'}
+
+ '@microsoft/tsdoc@0.16.0':
+ resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==}
+
+ '@napi-rs/wasm-runtime@1.1.4':
+ resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1
+ '@emnapi/runtime': ^1.7.1
+
+ '@nestjs/cli@11.0.21':
+ resolution: {integrity: sha512-F8mV0Sj/zVEouzR3NxBuJy08YHTUOmC5Xdcx3qIIaJWzrm8Vw86CHkhkaPBJ5ewRMHPDCShPmhsfwhpCcjts3A==}
+ engines: {node: '>= 20.11'}
+ hasBin: true
+ peerDependencies:
+ '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0
+ '@swc/core': ^1.3.62
+ peerDependenciesMeta:
+ '@swc/cli':
+ optional: true
+ '@swc/core':
+ optional: true
+
+ '@nestjs/common@11.1.19':
+ resolution: {integrity: sha512-qeiTt2tv+e5QyDKqG8HlVZb2wx64FEaSGFJouqTSRs+kG44iTfl3xlz1XqVped+rihx4hmjWgL5gkhtdK3E6+Q==}
+ peerDependencies:
+ class-transformer: '>=0.4.1'
+ class-validator: '>=0.13.2'
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ rxjs: ^7.1.0
+ peerDependenciesMeta:
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nestjs/core@11.1.19':
+ resolution: {integrity: sha512-6nJkWa2efrYi+XlU686J9y5L7OvxpLVjT0T/sxRKE7Jvpffiihelup4WSvLvRhdHDjj/5SuoWEwqReXAaaeHmw==}
+ engines: {node: '>= 20'}
+ peerDependencies:
+ '@nestjs/common': ^11.0.0
+ '@nestjs/microservices': ^11.0.0
+ '@nestjs/platform-express': ^11.0.0
+ '@nestjs/websockets': ^11.0.0
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ rxjs: ^7.1.0
+ peerDependenciesMeta:
+ '@nestjs/microservices':
+ optional: true
+ '@nestjs/platform-express':
+ optional: true
+ '@nestjs/websockets':
+ optional: true
+
+ '@nestjs/mapped-types@2.1.1':
+ resolution: {integrity: sha512-SCCoMEJ6jdeI5h/N+KCVF1+pmg/hmEkNA5nHTS8Gvww7T/LCl4o1gFLinw2iQ60w7slFkszHcGLKGdazVI4F8A==}
+ peerDependencies:
+ '@nestjs/common': ^10.0.0 || ^11.0.0
+ class-transformer: ^0.4.0 || ^0.5.0
+ class-validator: ^0.13.0 || ^0.14.0 || ^0.15.0
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ peerDependenciesMeta:
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nestjs/platform-express@11.1.19':
+ resolution: {integrity: sha512-Vpdv8jyCQdThfoTx+UTn+DRYr6H6X02YUqcpZ3qP6G3ZUwtVp7eS+hoQPGd4UuCnlnFG8Wqr2J9bGEzQdi1rIg==}
+ peerDependencies:
+ '@nestjs/common': ^11.0.0
+ '@nestjs/core': ^11.0.0
+
+ '@nestjs/schematics@11.1.0':
+ resolution: {integrity: sha512-lVxGZ46tcdItFMoXr6vyKWlnOsm1SZm/GUqAEDvy2RL4Q4O+3bkziAhrO7Y8JLssFUUvNFEGqAizI52WAxhjDw==}
+ peerDependencies:
+ prettier: ^3.0.0
+ typescript: '>=4.8.2'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+
+ '@nestjs/swagger@11.4.2':
+ resolution: {integrity: sha512-aBihEogDMj/bLEcaqhkvyX/ZVWUw/bmnhKzR0zwUoyGJikvZyaq7rOPYl/H7Lxkkr3c90SJxyuv1AX2UT1WKlw==}
+ peerDependencies:
+ '@fastify/static': ^8.0.0 || ^9.0.0
+ '@nestjs/common': ^11.0.1
+ '@nestjs/core': ^11.0.1
+ class-transformer: '*'
+ class-validator: '*'
+ reflect-metadata: ^0.1.12 || ^0.2.0
+ peerDependenciesMeta:
+ '@fastify/static':
+ optional: true
+ class-transformer:
+ optional: true
+ class-validator:
+ optional: true
+
+ '@nodable/entities@2.1.0':
+ resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==}
+
+ '@nuxt/opencollective@0.4.1':
+ resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==}
+ engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'}
+ hasBin: true
+
+ '@oxc-project/types@0.127.0':
+ resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==}
+
+ '@pinojs/redact@0.4.0':
+ resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==}
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.17':
+ resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.17':
+ resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.17':
+ resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.17':
+ resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17':
+ resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17':
+ resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17':
+ resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.17':
+ resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.17':
+ resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.17':
+ resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17':
+ resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
+ resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.0-rc.17':
+ resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==}
+
+ '@rolldown/pluginutils@1.0.0-rc.7':
+ resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==}
+
+ '@scarf/scarf@1.4.0':
+ resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==}
+
+ '@smithy/chunked-blob-reader-native@4.2.3':
+ resolution: {integrity: sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/chunked-blob-reader@5.2.2':
+ resolution: {integrity: sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/config-resolver@4.4.17':
+ resolution: {integrity: sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/core@3.23.17':
+ resolution: {integrity: sha512-x7BlLbUFL8NWCGjMF9C+1N5cVCxcPa7g6Tv9B4A2luWx3be3oU8hQ96wIwxe/s7OhIzvoJH73HAUSg5JXVlEtQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/credential-provider-imds@4.2.14':
+ resolution: {integrity: sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-codec@4.2.14':
+ resolution: {integrity: sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-browser@4.2.14':
+ resolution: {integrity: sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-config-resolver@4.3.14':
+ resolution: {integrity: sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-node@4.2.14':
+ resolution: {integrity: sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/eventstream-serde-universal@4.2.14':
+ resolution: {integrity: sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/fetch-http-handler@5.3.17':
+ resolution: {integrity: sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-blob-browser@4.2.15':
+ resolution: {integrity: sha512-0PJ4Al3fg2nM4qKrAIxyNcApgqHAXcBkN8FeizOz69z0rb26uZ6lMESYtxegaTlXB5Hj84JfwMPavMrwDMjucA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-node@4.2.14':
+ resolution: {integrity: sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/hash-stream-node@4.2.14':
+ resolution: {integrity: sha512-tw4GANWkZPb6+BdD4Fgucqzey2+r73Z/GRo9zklsCdwrnxxumUV83ZIaBDdudV4Ylazw3EPTiJZhpX42105ruQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/invalid-dependency@4.2.14':
+ resolution: {integrity: sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/is-array-buffer@2.2.0':
+ resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/is-array-buffer@4.2.2':
+ resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/md5-js@4.2.14':
+ resolution: {integrity: sha512-V2v0vx+h0iUSNG1Alt+GNBMSLGCrl9iVsdd+Ap67HPM9PN479x12V8LkuMoKImNZxn3MXeuyUjls+/7ZACZghA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-content-length@4.2.14':
+ resolution: {integrity: sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-endpoint@4.4.32':
+ resolution: {integrity: sha512-ZZkgyjnJppiZbIm6Qbx92pbXYi1uzenIvGhBSCDlc7NwuAkiqSgS75j1czAD25ZLs2FjMjYy1q7gyRVWG6JA0Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-retry@4.5.7':
+ resolution: {integrity: sha512-bRt6ZImqVSeTk39Nm81K20ObIiAZ3WefY7G6+iz/0tZjs4dgRRjvRX2sgsH+zi6iDCRR/aQvQofLKxxz4rPBZg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-serde@4.2.20':
+ resolution: {integrity: sha512-Lx9JMO9vArPtiChE3wbEZ5akMIDQpWQtlu90lhACQmNOXcGXRbaDywMHDzuDZ2OkZzP+9wQfZi3YJT9F67zTQQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/middleware-stack@4.2.14':
+ resolution: {integrity: sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-config-provider@4.3.14':
+ resolution: {integrity: sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/node-http-handler@4.6.1':
+ resolution: {integrity: sha512-iB+orM4x3xrr57X3YaXazfKnntl0LHlZB1kcXSGzMV1Tt0+YwEjGlbjk/44qEGtBzXAz6yFDzkYTKSV6Pj2HUg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/property-provider@4.2.14':
+ resolution: {integrity: sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/protocol-http@5.3.14':
+ resolution: {integrity: sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/querystring-builder@4.2.14':
+ resolution: {integrity: sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/querystring-parser@4.2.14':
+ resolution: {integrity: sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/service-error-classification@4.3.1':
+ resolution: {integrity: sha512-aUQuDGh760ts/8MU+APjIZhlLPKhIIfqyzZaJikLEIMrdxFvxuLYD0WxWzaYWpmLbQlXDe9p7EWM3HsBe0K6Gw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/shared-ini-file-loader@4.4.9':
+ resolution: {integrity: sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/signature-v4@5.3.14':
+ resolution: {integrity: sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/smithy-client@4.12.13':
+ resolution: {integrity: sha512-y/Pcj1V9+qG98gyu1gvftHB7rDpdh+7kIBIggs55yGm3JdtBV8GT8IFF3a1qxZ79QnaJHX9GXzvBG6tAd+czJA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/types@4.14.1':
+ resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/url-parser@4.2.14':
+ resolution: {integrity: sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-base64@4.3.2':
+ resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-body-length-browser@4.2.2':
+ resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-body-length-node@4.2.3':
+ resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-buffer-from@2.2.0':
+ resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-buffer-from@4.2.2':
+ resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-config-provider@4.2.2':
+ resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-defaults-mode-browser@4.3.49':
+ resolution: {integrity: sha512-a5bNrdiONYB/qE2BuKegvUMd/+ZDwdg4vsNuuSzYE8qs2EYAdK9CynL+Rzn29PbPiUqoz/cbpRbcLzD5lEevHw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-defaults-mode-node@4.2.54':
+ resolution: {integrity: sha512-g1cvrJvOnzeJgEdf7AE4luI7gp6L8weE0y9a9wQUSGtjb8QRHDbCJYuE4Sy0SD9N8RrnNPFsPltAz/OSoBR9Zw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-endpoints@3.4.2':
+ resolution: {integrity: sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-hex-encoding@4.2.2':
+ resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-middleware@4.2.14':
+ resolution: {integrity: sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-retry@4.3.8':
+ resolution: {integrity: sha512-LUIxbTBi+OpvXpg91poGA6BdyoleMDLnfXjVDqyi2RvZmTveY5loE/FgYUBCR5LU2BThW2SoZRh8dTIIy38IPw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-stream@4.5.25':
+ resolution: {integrity: sha512-/PFpG4k8Ze8Ei+mMKj3oiPICYekthuzePZMgZbCqMiXIHHf4n2aZ4Ps0aSRShycFTGuj/J6XldmC0x0DwednIA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-uri-escape@4.2.2':
+ resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-utf8@2.3.0':
+ resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
+ engines: {node: '>=14.0.0'}
+
+ '@smithy/util-utf8@4.2.2':
+ resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/util-waiter@4.3.0':
+ resolution: {integrity: sha512-JyjYmLAfS+pdxF92o4yLgEoy0zhayKTw73FU1aofLWwLcJw7iSqIY2exGmMTrl/lmZugP5p/zxdFSippJDfKWA==}
+ engines: {node: '>=18.0.0'}
+
+ '@smithy/uuid@1.1.2':
+ resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==}
+ engines: {node: '>=18.0.0'}
+
+ '@tokenizer/inflate@0.4.1':
+ resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==}
+ engines: {node: '>=18'}
+
+ '@tokenizer/token@0.3.0':
+ resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
+
+ '@tybys/wasm-util@0.10.2':
+ resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==}
+
+ '@types/amqplib@0.10.8':
+ resolution: {integrity: sha512-vtDp8Pk1wsE/AuQ8/Rgtm6KUZYqcnTgNvEHwzCkX8rL7AGsC6zqAfKAAJhUZXFhM/Pp++tbnUHiam/8vVpPztA==}
+
+ '@types/body-parser@1.19.6':
+ resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/eslint-scope@3.7.7':
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
+ '@types/express-serve-static-core@5.1.1':
+ resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==}
+
+ '@types/express@5.0.6':
+ resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==}
+
+ '@types/http-errors@2.0.5':
+ resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/node@24.12.2':
+ resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==}
+
+ '@types/node@25.6.0':
+ resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==}
+
+ '@types/pg@8.20.0':
+ resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==}
+
+ '@types/qs@6.15.0':
+ resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/react-dom@19.2.3':
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
+ peerDependencies:
+ '@types/react': ^19.2.0
+
+ '@types/react@19.2.14':
+ resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==}
+
+ '@types/send@1.2.1':
+ resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
+
+ '@types/serve-static@2.2.0':
+ resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==}
+
+ '@types/swagger-ui-express@4.1.8':
+ resolution: {integrity: sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==}
+
+ '@vitejs/plugin-react@6.0.1':
+ resolution: {integrity: sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0
+ babel-plugin-react-compiler: ^1.0.0
+ vite: ^8.0.0
+ peerDependenciesMeta:
+ '@rolldown/plugin-babel':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+
+ '@webassemblyjs/ast@1.14.1':
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2':
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ '@webassemblyjs/helper-api-error@1.13.2':
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ '@webassemblyjs/helper-buffer@1.14.1':
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2':
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+
+ '@webassemblyjs/ieee754@1.13.2':
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+
+ '@webassemblyjs/leb128@1.13.2':
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+
+ '@webassemblyjs/utf8@1.13.2':
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+
+ '@xtuc/ieee754@1.2.0':
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ '@xtuc/long@4.2.2':
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ abstract-logging@2.0.1:
+ resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==}
+
+ accepts@2.0.0:
+ resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
+ engines: {node: '>= 0.6'}
+
+ acorn-import-phases@1.0.4:
+ resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ acorn: ^8.14.0
+
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv-formats@2.1.1:
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-keywords@3.5.2:
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+
+ ajv-keywords@5.1.0:
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+
+ ajv@6.15.0:
+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
+
+ ajv@8.18.0:
+ resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==}
+
+ ajv@8.20.0:
+ resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
+
+ amqplib@1.0.4:
+ resolution: {integrity: sha512-dS828kpbJM7vhDCksy151BuPCgx2Sw9g3s2OCoOCV6eenFcQU59SaUK78h+3Fd3Vzh0ytkdhxlZ6dKRVtF93WA==}
+ engines: {node: '>=18'}
+
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansis@4.2.0:
+ resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==}
+ engines: {node: '>=14'}
+
+ append-field@1.0.0:
+ resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-timsort@1.0.3:
+ resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==}
+
+ atomic-sleep@1.0.0:
+ resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+ engines: {node: '>=8.0.0'}
+
+ avvio@9.2.0:
+ resolution: {integrity: sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ balanced-match@4.0.4:
+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
+ engines: {node: 18 || 20 || >=22}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ baseline-browser-mapping@2.10.27:
+ resolution: {integrity: sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ body-parser@2.2.2:
+ resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==}
+ engines: {node: '>=18'}
+
+ bowser@2.14.1:
+ resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==}
+
+ brace-expansion@1.1.14:
+ resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==}
+
+ brace-expansion@5.0.5:
+ resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==}
+ engines: {node: 18 || 20 || >=22}
+
+ browserslist@4.28.2:
+ resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer-more-ints@1.0.0:
+ resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ caniuse-lite@1.0.30001791:
+ resolution: {integrity: sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
+
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
+ chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
+ cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ cli-table3@0.6.5:
+ resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ engines: {node: 10.* || >= 12.*}
+
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ comment-json@5.0.0:
+ resolution: {integrity: sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==}
+ engines: {node: '>= 6'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ concat-stream@2.0.0:
+ resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
+ engines: {'0': node >= 6.0}
+
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ content-disposition@1.1.0:
+ resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}
+ engines: {node: '>=18'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ cookie-signature@1.2.2:
+ resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
+ engines: {node: '>=6.6.0'}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ cookie@1.1.1:
+ resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
+ engines: {node: '>=18'}
+
+ cors@2.8.6:
+ resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
+ engines: {node: '>= 0.10'}
+
+ cosmiconfig@8.3.6:
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
+ drizzle-kit@0.31.10:
+ resolution: {integrity: sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==}
+ hasBin: true
+
+ drizzle-orm@0.45.2:
+ resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==}
+ peerDependencies:
+ '@aws-sdk/client-rds-data': '>=3'
+ '@cloudflare/workers-types': '>=4'
+ '@electric-sql/pglite': '>=0.2.0'
+ '@libsql/client': '>=0.10.0'
+ '@libsql/client-wasm': '>=0.10.0'
+ '@neondatabase/serverless': '>=0.10.0'
+ '@op-engineering/op-sqlite': '>=2'
+ '@opentelemetry/api': ^1.4.1
+ '@planetscale/database': '>=1.13'
+ '@prisma/client': '*'
+ '@tidbcloud/serverless': '*'
+ '@types/better-sqlite3': '*'
+ '@types/pg': '*'
+ '@types/sql.js': '*'
+ '@upstash/redis': '>=1.34.7'
+ '@vercel/postgres': '>=0.8.0'
+ '@xata.io/client': '*'
+ better-sqlite3: '>=7'
+ bun-types: '*'
+ expo-sqlite: '>=14.0.0'
+ gel: '>=2'
+ knex: '*'
+ kysely: '*'
+ mysql2: '>=2'
+ pg: '>=8'
+ postgres: '>=3'
+ prisma: '*'
+ sql.js: '>=1'
+ sqlite3: '>=5'
+ peerDependenciesMeta:
+ '@aws-sdk/client-rds-data':
+ optional: true
+ '@cloudflare/workers-types':
+ optional: true
+ '@electric-sql/pglite':
+ optional: true
+ '@libsql/client':
+ optional: true
+ '@libsql/client-wasm':
+ optional: true
+ '@neondatabase/serverless':
+ optional: true
+ '@op-engineering/op-sqlite':
+ optional: true
+ '@opentelemetry/api':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@prisma/client':
+ optional: true
+ '@tidbcloud/serverless':
+ optional: true
+ '@types/better-sqlite3':
+ optional: true
+ '@types/pg':
+ optional: true
+ '@types/sql.js':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/postgres':
+ optional: true
+ '@xata.io/client':
+ optional: true
+ better-sqlite3:
+ optional: true
+ bun-types:
+ optional: true
+ expo-sqlite:
+ optional: true
+ gel:
+ optional: true
+ knex:
+ optional: true
+ kysely:
+ optional: true
+ mysql2:
+ optional: true
+ pg:
+ optional: true
+ postgres:
+ optional: true
+ prisma:
+ optional: true
+ sql.js:
+ optional: true
+ sqlite3:
+ optional: true
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ electron-to-chromium@1.5.349:
+ resolution: {integrity: sha512-QsWVGyRuY07Aqb234QytTfwd5d9AJlfNIQ5wIOl1L+PZDzI9d9+Fn0FRale/QYlFxt/bUnB0/nLd1jFPGxGK1A==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ enhanced-resolve@5.21.0:
+ resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==}
+ engines: {node: '>=10.13.0'}
+
+ error-ex@1.3.4:
+ resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-module-lexer@2.1.0:
+ resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.18.20:
+ resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+ engines: {node: '>=12'}
+ hasBin: true
+
+ esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ esbuild@0.27.7:
+ resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ express@5.2.1:
+ resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
+ engines: {node: '>= 18'}
+
+ fast-decode-uri-component@1.0.1:
+ resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-json-stringify@6.3.0:
+ resolution: {integrity: sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==}
+
+ fast-querystring@1.1.2:
+ resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
+
+ fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
+ fast-uri@3.1.1:
+ resolution: {integrity: sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==}
+
+ fast-xml-builder@1.1.8:
+ resolution: {integrity: sha512-sDVBc2gg8pSKvcbE8rBmOyjSGQf0AdsbqvHeIOv3D/uYNoV4eCReQXyDF8Pdv8+m1FHazACypSz2hR7O2S1LLw==}
+
+ fast-xml-parser@5.7.2:
+ resolution: {integrity: sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==}
+ hasBin: true
+
+ fastify@5.8.5:
+ resolution: {integrity: sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==}
+
+ fastq@1.20.1:
+ resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ file-type@21.3.4:
+ resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==}
+ engines: {node: '>=20'}
+
+ finalhandler@2.1.1:
+ resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
+ engines: {node: '>= 18.0.0'}
+
+ find-my-way@9.5.0:
+ resolution: {integrity: sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==}
+ engines: {node: '>=20'}
+
+ fork-ts-checker-webpack-plugin@9.1.0:
+ resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ typescript: '>3.6.0'
+ webpack: ^5.11.0
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@2.0.0:
+ resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
+ engines: {node: '>= 0.8'}
+
+ fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+
+ fs-monkey@1.1.0:
+ resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.14.0:
+ resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==}
+
+ glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ glob@13.0.6:
+ resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
+ engines: {node: 18 || 20 || >=22}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.3:
+ resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
+ engines: {node: '>= 0.4'}
+
+ http-errors@2.0.1:
+ resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
+ engines: {node: '>= 0.8'}
+
+ iconv-lite@0.7.2:
+ resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+ engines: {node: '>=6'}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ ipaddr.js@2.4.0:
+ resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==}
+ engines: {node: '>= 10'}
+
+ is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-promise@4.0.0:
+ resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ iterare@1.2.1:
+ resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==}
+ engines: {node: '>=6'}
+
+ jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ hasBin: true
+
+ json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ json-schema-ref-resolver@3.0.0:
+ resolution: {integrity: sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@3.3.1:
+ resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
+
+ jsonfile@6.2.1:
+ resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==}
+
+ light-my-request@6.6.0:
+ resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==}
+
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ load-esm@1.0.3:
+ resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==}
+ engines: {node: '>=13.2.0'}
+
+ loader-runner@4.3.2:
+ resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==}
+ engines: {node: '>=6.11.5'}
+
+ lodash@4.18.1:
+ resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ lru-cache@11.3.6:
+ resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==}
+ engines: {node: 20 || >=22}
+
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ media-typer@1.1.0:
+ resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
+ engines: {node: '>= 0.8'}
+
+ memfs@3.5.3:
+ resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+ engines: {node: '>= 4.0.0'}
+
+ merge-descriptors@2.0.0:
+ resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
+ engines: {node: '>=18'}
+
+ merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-db@1.54.0:
+ resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@3.0.2:
+ resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
+ engines: {node: '>=18'}
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ minimatch@10.2.5:
+ resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+ engines: {node: 18 || 20 || >=22}
+
+ minimatch@3.1.5:
+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.3:
+ resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ multer@2.1.1:
+ resolution: {integrity: sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==}
+ engines: {node: '>= 10.16.0'}
+
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ nanoid@3.3.12:
+ resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
+ engines: {node: '>= 0.6'}
+
+ neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ node-abort-controller@3.1.1:
+ resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+
+ node-emoji@1.11.0:
+ resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
+
+ node-releases@2.0.38:
+ resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+ engines: {node: '>= 0.4'}
+
+ on-exit-leak-free@2.1.2:
+ resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
+ engines: {node: '>=14.0.0'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ path-expression-matcher@1.5.0:
+ resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==}
+ engines: {node: '>=14.0.0'}
+
+ path-scurry@2.0.2:
+ resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
+ engines: {node: 18 || 20 || >=22}
+
+ path-to-regexp@8.4.2:
+ resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
+
+ path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ pg-cloudflare@1.3.0:
+ resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==}
+
+ pg-connection-string@2.12.0:
+ resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.13.0:
+ resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.13.0:
+ resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.20.0:
+ resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==}
+ engines: {node: '>= 16.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
+
+ pino-abstract-transport@3.0.0:
+ resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==}
+
+ pino-std-serializers@7.1.0:
+ resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==}
+
+ pino@10.3.1:
+ resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==}
+ hasBin: true
+
+ pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+
+ postcss@8.5.14:
+ resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.1:
+ resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
+ process-warning@4.0.1:
+ resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==}
+
+ process-warning@5.0.0:
+ resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qs@6.15.1:
+ resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==}
+ engines: {node: '>=0.6'}
+
+ quick-format-unescaped@4.0.4:
+ resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@3.0.2:
+ resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
+ engines: {node: '>= 0.10'}
+
+ react-dom@19.2.5:
+ resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==}
+ peerDependencies:
+ react: ^19.2.5
+
+ react@19.2.5:
+ resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==}
+ engines: {node: '>=0.10.0'}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+ engines: {node: '>= 14.18.0'}
+
+ real-require@0.2.0:
+ resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
+ engines: {node: '>= 12.13.0'}
+
+ reflect-metadata@0.2.2:
+ resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
+ ret@0.5.0:
+ resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==}
+ engines: {node: '>=10'}
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rfdc@1.4.1:
+ resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+ rolldown@1.0.0-rc.17:
+ resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
+ router@2.2.0:
+ resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
+ engines: {node: '>= 18'}
+
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+ rxjs@7.8.2:
+ resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safe-regex2@5.1.1:
+ resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==}
+ hasBin: true
+
+ safe-stable-stringify@2.5.0:
+ resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
+ engines: {node: '>=10'}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+
+ schema-utils@3.3.0:
+ resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+ engines: {node: '>= 10.13.0'}
+
+ schema-utils@4.3.3:
+ resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
+ engines: {node: '>= 10.13.0'}
+
+ secure-json-parse@4.1.0:
+ resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==}
+
+ semver@7.7.4:
+ resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@1.2.1:
+ resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
+ engines: {node: '>= 18'}
+
+ serve-static@2.2.1:
+ resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
+ engines: {node: '>= 18'}
+
+ set-cookie-parser@2.7.2:
+ resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ side-channel-list@1.0.1:
+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ sonic-boom@4.2.1:
+ resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ statuses@2.0.2:
+ resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
+ engines: {node: '>= 0.8'}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strnum@2.2.3:
+ resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==}
+
+ strtok3@10.3.5:
+ resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==}
+ engines: {node: '>=18'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ swagger-ui-dist@5.32.4:
+ resolution: {integrity: sha512-0AADFFQNJzExEN49SrD/34Nn9cxNxVLiydYl2MBwSZFPVXNkVwC/EFAjoezGGqE8oDegiDC+p47t8lKObCinMQ==}
+
+ swagger-ui-dist@5.32.5:
+ resolution: {integrity: sha512-7/FQfWe9A4qoyYFdAwy0chD0uDYidDp/ZT9VQ9LZlgD4AnnHJk8/+ytAA1HkJYOPySmK6helPDdJQMlcumt7HA==}
+
+ swagger-ui-express@5.0.1:
+ resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==}
+ engines: {node: '>= v0.10.32'}
+ peerDependencies:
+ express: '>=4.0.0 || >=5.0.0-beta'
+
+ symbol-observable@4.0.0:
+ resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==}
+ engines: {node: '>=0.10'}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
+ terser-webpack-plugin@5.5.0:
+ resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+
+ terser@5.46.2:
+ resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ thread-stream@4.0.0:
+ resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==}
+ engines: {node: '>=20'}
+
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
+ engines: {node: '>=12.0.0'}
+
+ toad-cache@3.7.0:
+ resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==}
+ engines: {node: '>=12'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ token-types@6.1.2:
+ resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==}
+ engines: {node: '>=14.16'}
+
+ tsconfig-paths-webpack-plugin@4.2.0:
+ resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==}
+ engines: {node: '>=10.13.0'}
+
+ tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ tsx@4.21.0:
+ resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ type-is@2.0.1:
+ resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
+ engines: {node: '>= 0.6'}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uid@2.0.2:
+ resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==}
+ engines: {node: '>=8'}
+
+ uint8array-extras@1.5.0:
+ resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==}
+ engines: {node: '>=18'}
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ undici-types@7.19.2:
+ resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ vite@8.0.10:
+ resolution: {integrity: sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.1.0
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ watchpack@2.5.1:
+ resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
+ engines: {node: '>=10.13.0'}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ webpack-node-externals@3.0.0:
+ resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==}
+ engines: {node: '>=6'}
+
+ webpack-sources@3.4.1:
+ resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==}
+ engines: {node: '>=10.13.0'}
+
+ webpack@5.106.0:
+ resolution: {integrity: sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yoctocolors-cjs@2.1.3:
+ resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
+ engines: {node: '>=18'}
+
+snapshots:
+
+ '@angular-devkit/core@19.2.24(chokidar@4.0.3)':
+ dependencies:
+ ajv: 8.18.0
+ ajv-formats: 3.0.1(ajv@8.18.0)
+ jsonc-parser: 3.3.1
+ picomatch: 4.0.4
+ rxjs: 7.8.1
+ source-map: 0.7.4
+ optionalDependencies:
+ chokidar: 4.0.3
+
+ '@angular-devkit/schematics-cli@19.2.24(@types/node@24.12.2)(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3)
+ '@inquirer/prompts': 7.3.2(@types/node@24.12.2)
+ ansi-colors: 4.1.3
+ symbol-observable: 4.0.0
+ yargs-parser: 21.1.1
+ transitivePeerDependencies:
+ - '@types/node'
+ - chokidar
+
+ '@angular-devkit/schematics@19.2.24(chokidar@4.0.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ jsonc-parser: 3.3.1
+ magic-string: 0.30.17
+ ora: 5.4.1
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - chokidar
+
+ '@aws-crypto/crc32@5.2.0':
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.973.8
+ tslib: 2.8.1
+
+ '@aws-crypto/crc32c@5.2.0':
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.973.8
+ tslib: 2.8.1
+
+ '@aws-crypto/sha1-browser@5.2.0':
+ dependencies:
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-locate-window': 3.965.5
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-crypto/sha256-browser@5.2.0':
+ dependencies:
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-locate-window': 3.965.5
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-crypto/sha256-js@5.2.0':
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.973.8
+ tslib: 2.8.1
+
+ '@aws-crypto/supports-web-crypto@5.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-crypto/util@5.2.0':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+
+ '@aws-sdk/client-s3@3.1042.0':
+ dependencies:
+ '@aws-crypto/sha1-browser': 5.2.0
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/credential-provider-node': 3.972.39
+ '@aws-sdk/middleware-bucket-endpoint': 3.972.10
+ '@aws-sdk/middleware-expect-continue': 3.972.10
+ '@aws-sdk/middleware-flexible-checksums': 3.974.16
+ '@aws-sdk/middleware-host-header': 3.972.10
+ '@aws-sdk/middleware-location-constraint': 3.972.10
+ '@aws-sdk/middleware-logger': 3.972.10
+ '@aws-sdk/middleware-recursion-detection': 3.972.11
+ '@aws-sdk/middleware-sdk-s3': 3.972.37
+ '@aws-sdk/middleware-ssec': 3.972.10
+ '@aws-sdk/middleware-user-agent': 3.972.38
+ '@aws-sdk/region-config-resolver': 3.972.13
+ '@aws-sdk/signature-v4-multi-region': 3.996.25
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-endpoints': 3.996.8
+ '@aws-sdk/util-user-agent-browser': 3.972.10
+ '@aws-sdk/util-user-agent-node': 3.973.24
+ '@smithy/config-resolver': 4.4.17
+ '@smithy/core': 3.23.17
+ '@smithy/eventstream-serde-browser': 4.2.14
+ '@smithy/eventstream-serde-config-resolver': 4.3.14
+ '@smithy/eventstream-serde-node': 4.2.14
+ '@smithy/fetch-http-handler': 5.3.17
+ '@smithy/hash-blob-browser': 4.2.15
+ '@smithy/hash-node': 4.2.14
+ '@smithy/hash-stream-node': 4.2.14
+ '@smithy/invalid-dependency': 4.2.14
+ '@smithy/md5-js': 4.2.14
+ '@smithy/middleware-content-length': 4.2.14
+ '@smithy/middleware-endpoint': 4.4.32
+ '@smithy/middleware-retry': 4.5.7
+ '@smithy/middleware-serde': 4.2.20
+ '@smithy/middleware-stack': 4.2.14
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/node-http-handler': 4.6.1
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ '@smithy/url-parser': 4.2.14
+ '@smithy/util-base64': 4.3.2
+ '@smithy/util-body-length-browser': 4.2.2
+ '@smithy/util-body-length-node': 4.2.3
+ '@smithy/util-defaults-mode-browser': 4.3.49
+ '@smithy/util-defaults-mode-node': 4.2.54
+ '@smithy/util-endpoints': 3.4.2
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-retry': 4.3.8
+ '@smithy/util-stream': 4.5.25
+ '@smithy/util-utf8': 4.2.2
+ '@smithy/util-waiter': 4.3.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/core@3.974.8':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/xml-builder': 3.972.22
+ '@smithy/core': 3.23.17
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/property-provider': 4.2.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/signature-v4': 5.3.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ '@smithy/util-base64': 4.3.2
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-retry': 4.3.8
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@aws-sdk/crc64-nvme@3.972.7':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-env@3.972.34':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/types': 3.973.8
+ '@smithy/property-provider': 4.2.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-http@3.972.36':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/types': 3.973.8
+ '@smithy/fetch-http-handler': 5.3.17
+ '@smithy/node-http-handler': 4.6.1
+ '@smithy/property-provider': 4.2.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ '@smithy/util-stream': 4.5.25
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-ini@3.972.38':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/credential-provider-env': 3.972.34
+ '@aws-sdk/credential-provider-http': 3.972.36
+ '@aws-sdk/credential-provider-login': 3.972.38
+ '@aws-sdk/credential-provider-process': 3.972.34
+ '@aws-sdk/credential-provider-sso': 3.972.38
+ '@aws-sdk/credential-provider-web-identity': 3.972.38
+ '@aws-sdk/nested-clients': 3.997.6
+ '@aws-sdk/types': 3.973.8
+ '@smithy/credential-provider-imds': 4.2.14
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-login@3.972.38':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/nested-clients': 3.997.6
+ '@aws-sdk/types': 3.973.8
+ '@smithy/property-provider': 4.2.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-node@3.972.39':
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.972.34
+ '@aws-sdk/credential-provider-http': 3.972.36
+ '@aws-sdk/credential-provider-ini': 3.972.38
+ '@aws-sdk/credential-provider-process': 3.972.34
+ '@aws-sdk/credential-provider-sso': 3.972.38
+ '@aws-sdk/credential-provider-web-identity': 3.972.38
+ '@aws-sdk/types': 3.973.8
+ '@smithy/credential-provider-imds': 4.2.14
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-process@3.972.34':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/types': 3.973.8
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/credential-provider-sso@3.972.38':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/nested-clients': 3.997.6
+ '@aws-sdk/token-providers': 3.1041.0
+ '@aws-sdk/types': 3.973.8
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/credential-provider-web-identity@3.972.38':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/nested-clients': 3.997.6
+ '@aws-sdk/types': 3.973.8
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/middleware-bucket-endpoint@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-arn-parser': 3.972.3
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-config-provider': 4.2.2
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-expect-continue@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-flexible-checksums@3.974.16':
+ dependencies:
+ '@aws-crypto/crc32': 5.2.0
+ '@aws-crypto/crc32c': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/crc64-nvme': 3.972.7
+ '@aws-sdk/types': 3.973.8
+ '@smithy/is-array-buffer': 4.2.2
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-stream': 4.5.25
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-host-header@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-location-constraint@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-logger@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-recursion-detection@3.972.11':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@aws/lambda-invoke-store': 0.2.4
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-sdk-s3@3.972.37':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-arn-parser': 3.972.3
+ '@smithy/core': 3.23.17
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/signature-v4': 5.3.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ '@smithy/util-config-provider': 4.2.2
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-stream': 4.5.25
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-ssec@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/middleware-user-agent@3.972.38':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-endpoints': 3.996.8
+ '@smithy/core': 3.23.17
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-retry': 4.3.8
+ tslib: 2.8.1
+
+ '@aws-sdk/nested-clients@3.997.6':
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/middleware-host-header': 3.972.10
+ '@aws-sdk/middleware-logger': 3.972.10
+ '@aws-sdk/middleware-recursion-detection': 3.972.11
+ '@aws-sdk/middleware-user-agent': 3.972.38
+ '@aws-sdk/region-config-resolver': 3.972.13
+ '@aws-sdk/signature-v4-multi-region': 3.996.25
+ '@aws-sdk/types': 3.973.8
+ '@aws-sdk/util-endpoints': 3.996.8
+ '@aws-sdk/util-user-agent-browser': 3.972.10
+ '@aws-sdk/util-user-agent-node': 3.973.24
+ '@smithy/config-resolver': 4.4.17
+ '@smithy/core': 3.23.17
+ '@smithy/fetch-http-handler': 5.3.17
+ '@smithy/hash-node': 4.2.14
+ '@smithy/invalid-dependency': 4.2.14
+ '@smithy/middleware-content-length': 4.2.14
+ '@smithy/middleware-endpoint': 4.4.32
+ '@smithy/middleware-retry': 4.5.7
+ '@smithy/middleware-serde': 4.2.20
+ '@smithy/middleware-stack': 4.2.14
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/node-http-handler': 4.6.1
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ '@smithy/url-parser': 4.2.14
+ '@smithy/util-base64': 4.3.2
+ '@smithy/util-body-length-browser': 4.2.2
+ '@smithy/util-body-length-node': 4.2.3
+ '@smithy/util-defaults-mode-browser': 4.3.49
+ '@smithy/util-defaults-mode-node': 4.2.54
+ '@smithy/util-endpoints': 3.4.2
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-retry': 4.3.8
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/region-config-resolver@3.972.13':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/config-resolver': 4.4.17
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/signature-v4-multi-region@3.996.25':
+ dependencies:
+ '@aws-sdk/middleware-sdk-s3': 3.972.37
+ '@aws-sdk/types': 3.973.8
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/signature-v4': 5.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/token-providers@3.1041.0':
+ dependencies:
+ '@aws-sdk/core': 3.974.8
+ '@aws-sdk/nested-clients': 3.997.6
+ '@aws-sdk/types': 3.973.8
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/types@3.973.8':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/util-arn-parser@3.972.3':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-sdk/util-endpoints@3.996.8':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/types': 4.14.1
+ '@smithy/url-parser': 4.2.14
+ '@smithy/util-endpoints': 3.4.2
+ tslib: 2.8.1
+
+ '@aws-sdk/util-locate-window@3.965.5':
+ dependencies:
+ tslib: 2.8.1
+
+ '@aws-sdk/util-user-agent-browser@3.972.10':
+ dependencies:
+ '@aws-sdk/types': 3.973.8
+ '@smithy/types': 4.14.1
+ bowser: 2.14.1
+ tslib: 2.8.1
+
+ '@aws-sdk/util-user-agent-node@3.973.24':
+ dependencies:
+ '@aws-sdk/middleware-user-agent': 3.972.38
+ '@aws-sdk/types': 3.973.8
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-config-provider': 4.2.2
+ tslib: 2.8.1
+
+ '@aws-sdk/xml-builder@3.972.22':
+ dependencies:
+ '@nodable/entities': 2.1.0
+ '@smithy/types': 4.14.1
+ fast-xml-parser: 5.7.2
+ tslib: 2.8.1
+
+ '@aws/lambda-invoke-store@0.2.4': {}
+
+ '@babel/code-frame@7.29.0':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/helper-validator-identifier@7.28.5': {}
+
+ '@borewit/text-codec@0.2.2': {}
+
+ '@colors/colors@1.5.0':
+ optional: true
+
+ '@drizzle-team/brocli@0.10.2': {}
+
+ '@emnapi/core@1.10.0':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.1
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.10.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.2.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@esbuild-kit/core-utils@3.3.2':
+ dependencies:
+ esbuild: 0.18.20
+ source-map-support: 0.5.21
+
+ '@esbuild-kit/esm-loader@2.6.5':
+ dependencies:
+ '@esbuild-kit/core-utils': 3.3.2
+ get-tsconfig: 4.14.0
+
+ '@esbuild/aix-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/aix-ppc64@0.27.7':
+ optional: true
+
+ '@esbuild/android-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/android-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/android-arm@0.18.20':
+ optional: true
+
+ '@esbuild/android-arm@0.25.12':
+ optional: true
+
+ '@esbuild/android-arm@0.27.7':
+ optional: true
+
+ '@esbuild/android-x64@0.18.20':
+ optional: true
+
+ '@esbuild/android-x64@0.25.12':
+ optional: true
+
+ '@esbuild/android-x64@0.27.7':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/darwin-x64@0.18.20':
+ optional: true
+
+ '@esbuild/darwin-x64@0.25.12':
+ optional: true
+
+ '@esbuild/darwin-x64@0.27.7':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-arm@0.18.20':
+ optional: true
+
+ '@esbuild/linux-arm@0.25.12':
+ optional: true
+
+ '@esbuild/linux-arm@0.27.7':
+ optional: true
+
+ '@esbuild/linux-ia32@0.18.20':
+ optional: true
+
+ '@esbuild/linux-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ia32@0.27.7':
+ optional: true
+
+ '@esbuild/linux-loong64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-loong64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-loong64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.18.20':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.25.12':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.27.7':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.27.7':
+ optional: true
+
+ '@esbuild/linux-s390x@0.18.20':
+ optional: true
+
+ '@esbuild/linux-s390x@0.25.12':
+ optional: true
+
+ '@esbuild/linux-s390x@0.27.7':
+ optional: true
+
+ '@esbuild/linux-x64@0.18.20':
+ optional: true
+
+ '@esbuild/linux-x64@0.25.12':
+ optional: true
+
+ '@esbuild/linux-x64@0.27.7':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.18.20':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.25.12':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/sunos-x64@0.18.20':
+ optional: true
+
+ '@esbuild/sunos-x64@0.25.12':
+ optional: true
+
+ '@esbuild/sunos-x64@0.27.7':
+ optional: true
+
+ '@esbuild/win32-arm64@0.18.20':
+ optional: true
+
+ '@esbuild/win32-arm64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-arm64@0.27.7':
+ optional: true
+
+ '@esbuild/win32-ia32@0.18.20':
+ optional: true
+
+ '@esbuild/win32-ia32@0.25.12':
+ optional: true
+
+ '@esbuild/win32-ia32@0.27.7':
+ optional: true
+
+ '@esbuild/win32-x64@0.18.20':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.12':
+ optional: true
+
+ '@esbuild/win32-x64@0.27.7':
+ optional: true
+
+ '@fastify/ajv-compiler@4.0.5':
+ dependencies:
+ ajv: 8.20.0
+ ajv-formats: 3.0.1(ajv@8.20.0)
+ fast-uri: 3.1.1
+
+ '@fastify/error@4.2.0': {}
+
+ '@fastify/fast-json-stringify-compiler@5.0.3':
+ dependencies:
+ fast-json-stringify: 6.3.0
+
+ '@fastify/forwarded@3.0.1': {}
+
+ '@fastify/merge-json-schemas@0.2.1':
+ dependencies:
+ dequal: 2.0.3
+
+ '@fastify/proxy-addr@5.1.0':
+ dependencies:
+ '@fastify/forwarded': 3.0.1
+ ipaddr.js: 2.4.0
+
+ '@inquirer/ansi@1.0.2': {}
+
+ '@inquirer/checkbox@4.3.2(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/confirm@5.1.21(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/core@10.3.2(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/editor@4.2.23(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/external-editor': 1.0.3(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/expand@4.0.23(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/external-editor@1.0.3(@types/node@24.12.2)':
+ dependencies:
+ chardet: 2.1.1
+ iconv-lite: 0.7.2
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/figures@1.0.15': {}
+
+ '@inquirer/input@4.3.1(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/number@3.0.23(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/password@4.0.23(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/prompts@7.10.1(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@24.12.2)
+ '@inquirer/confirm': 5.1.21(@types/node@24.12.2)
+ '@inquirer/editor': 4.2.23(@types/node@24.12.2)
+ '@inquirer/expand': 4.0.23(@types/node@24.12.2)
+ '@inquirer/input': 4.3.1(@types/node@24.12.2)
+ '@inquirer/number': 3.0.23(@types/node@24.12.2)
+ '@inquirer/password': 4.0.23(@types/node@24.12.2)
+ '@inquirer/rawlist': 4.1.11(@types/node@24.12.2)
+ '@inquirer/search': 3.2.2(@types/node@24.12.2)
+ '@inquirer/select': 4.4.2(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/prompts@7.3.2(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.2(@types/node@24.12.2)
+ '@inquirer/confirm': 5.1.21(@types/node@24.12.2)
+ '@inquirer/editor': 4.2.23(@types/node@24.12.2)
+ '@inquirer/expand': 4.0.23(@types/node@24.12.2)
+ '@inquirer/input': 4.3.1(@types/node@24.12.2)
+ '@inquirer/number': 3.0.23(@types/node@24.12.2)
+ '@inquirer/password': 4.0.23(@types/node@24.12.2)
+ '@inquirer/rawlist': 4.1.11(@types/node@24.12.2)
+ '@inquirer/search': 3.2.2(@types/node@24.12.2)
+ '@inquirer/select': 4.4.2(@types/node@24.12.2)
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/rawlist@4.1.11(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/search@3.2.2(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/select@4.4.2(@types/node@24.12.2)':
+ dependencies:
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.2(@types/node@24.12.2)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.12.2)
+ yoctocolors-cjs: 2.1.3
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@inquirer/type@3.0.10(@types/node@24.12.2)':
+ optionalDependencies:
+ '@types/node': 24.12.2
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ '@lukeed/csprng@1.1.0': {}
+
+ '@microsoft/tsdoc@0.16.0': {}
+
+ '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)':
+ dependencies:
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@tybys/wasm-util': 0.10.2
+ optional: true
+
+ '@nestjs/cli@11.0.21(@types/node@24.12.2)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics-cli': 19.2.24(@types/node@24.12.2)(chokidar@4.0.3)
+ '@inquirer/prompts': 7.10.1(@types/node@24.12.2)
+ '@nestjs/schematics': 11.1.0(chokidar@4.0.3)(typescript@5.9.3)
+ ansis: 4.2.0
+ chokidar: 4.0.3
+ cli-table3: 0.6.5
+ commander: 4.1.1
+ fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0)
+ glob: 13.0.6
+ node-emoji: 1.11.0
+ ora: 5.4.1
+ tsconfig-paths: 4.2.0
+ tsconfig-paths-webpack-plugin: 4.2.0
+ typescript: 5.9.3
+ webpack: 5.106.0
+ webpack-node-externals: 3.0.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - esbuild
+ - prettier
+ - uglify-js
+ - webpack-cli
+
+ '@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ dependencies:
+ file-type: 21.3.4
+ iterare: 1.2.1
+ load-esm: 1.0.3
+ reflect-metadata: 0.2.2
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ uid: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@nestjs/core@11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
+ dependencies:
+ '@nestjs/common': 11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nuxt/opencollective': 0.4.1
+ fast-safe-stringify: 2.1.1
+ iterare: 1.2.1
+ path-to-regexp: 8.4.2
+ reflect-metadata: 0.2.2
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ uid: 2.0.2
+ optionalDependencies:
+ '@nestjs/platform-express': 11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)
+
+ '@nestjs/mapped-types@2.1.1(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)':
+ dependencies:
+ '@nestjs/common': 11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ reflect-metadata: 0.2.2
+
+ '@nestjs/platform-express@11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)':
+ dependencies:
+ '@nestjs/common': 11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ cors: 2.8.6
+ express: 5.2.1
+ multer: 2.1.1
+ path-to-regexp: 8.4.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@nestjs/schematics@11.1.0(chokidar@4.0.3)(typescript@5.9.3)':
+ dependencies:
+ '@angular-devkit/core': 19.2.24(chokidar@4.0.3)
+ '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3)
+ comment-json: 5.0.0
+ jsonc-parser: 3.3.1
+ pluralize: 8.0.0
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - chokidar
+
+ '@nestjs/swagger@11.4.2(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.19)(reflect-metadata@0.2.2)':
+ dependencies:
+ '@microsoft/tsdoc': 0.16.0
+ '@nestjs/common': 11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/core': 11.1.19(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.19)(reflect-metadata@0.2.2)(rxjs@7.8.2)
+ '@nestjs/mapped-types': 2.1.1(@nestjs/common@11.1.19(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)
+ js-yaml: 4.1.1
+ lodash: 4.18.1
+ path-to-regexp: 8.4.2
+ reflect-metadata: 0.2.2
+ swagger-ui-dist: 5.32.4
+
+ '@nodable/entities@2.1.0': {}
+
+ '@nuxt/opencollective@0.4.1':
+ dependencies:
+ consola: 3.4.2
+
+ '@oxc-project/types@0.127.0': {}
+
+ '@pinojs/redact@0.4.0': {}
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.17':
+ dependencies:
+ '@emnapi/core': 1.10.0
+ '@emnapi/runtime': 1.10.0
+ '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.0-rc.17': {}
+
+ '@rolldown/pluginutils@1.0.0-rc.7': {}
+
+ '@scarf/scarf@1.4.0': {}
+
+ '@smithy/chunked-blob-reader-native@4.2.3':
+ dependencies:
+ '@smithy/util-base64': 4.3.2
+ tslib: 2.8.1
+
+ '@smithy/chunked-blob-reader@5.2.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/config-resolver@4.4.17':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-config-provider': 4.2.2
+ '@smithy/util-endpoints': 3.4.2
+ '@smithy/util-middleware': 4.2.14
+ tslib: 2.8.1
+
+ '@smithy/core@3.23.17':
+ dependencies:
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/url-parser': 4.2.14
+ '@smithy/util-base64': 4.3.2
+ '@smithy/util-body-length-browser': 4.2.2
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-stream': 4.5.25
+ '@smithy/util-utf8': 4.2.2
+ '@smithy/uuid': 1.1.2
+ tslib: 2.8.1
+
+ '@smithy/credential-provider-imds@4.2.14':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/property-provider': 4.2.14
+ '@smithy/types': 4.14.1
+ '@smithy/url-parser': 4.2.14
+ tslib: 2.8.1
+
+ '@smithy/eventstream-codec@4.2.14':
+ dependencies:
+ '@aws-crypto/crc32': 5.2.0
+ '@smithy/types': 4.14.1
+ '@smithy/util-hex-encoding': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-browser@4.2.14':
+ dependencies:
+ '@smithy/eventstream-serde-universal': 4.2.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-config-resolver@4.3.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-node@4.2.14':
+ dependencies:
+ '@smithy/eventstream-serde-universal': 4.2.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/eventstream-serde-universal@4.2.14':
+ dependencies:
+ '@smithy/eventstream-codec': 4.2.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/fetch-http-handler@5.3.17':
+ dependencies:
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/querystring-builder': 4.2.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-base64': 4.3.2
+ tslib: 2.8.1
+
+ '@smithy/hash-blob-browser@4.2.15':
+ dependencies:
+ '@smithy/chunked-blob-reader': 5.2.2
+ '@smithy/chunked-blob-reader-native': 4.2.3
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/hash-node@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ '@smithy/util-buffer-from': 4.2.2
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/hash-stream-node@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/invalid-dependency@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/is-array-buffer@2.2.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/is-array-buffer@4.2.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/md5-js@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/middleware-content-length@4.2.14':
+ dependencies:
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/middleware-endpoint@4.4.32':
+ dependencies:
+ '@smithy/core': 3.23.17
+ '@smithy/middleware-serde': 4.2.20
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ '@smithy/url-parser': 4.2.14
+ '@smithy/util-middleware': 4.2.14
+ tslib: 2.8.1
+
+ '@smithy/middleware-retry@4.5.7':
+ dependencies:
+ '@smithy/core': 3.23.17
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/service-error-classification': 4.3.1
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-retry': 4.3.8
+ '@smithy/uuid': 1.1.2
+ tslib: 2.8.1
+
+ '@smithy/middleware-serde@4.2.20':
+ dependencies:
+ '@smithy/core': 3.23.17
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/middleware-stack@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/node-config-provider@4.3.14':
+ dependencies:
+ '@smithy/property-provider': 4.2.14
+ '@smithy/shared-ini-file-loader': 4.4.9
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/node-http-handler@4.6.1':
+ dependencies:
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/querystring-builder': 4.2.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/property-provider@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/protocol-http@5.3.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/querystring-builder@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ '@smithy/util-uri-escape': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/querystring-parser@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/service-error-classification@4.3.1':
+ dependencies:
+ '@smithy/types': 4.14.1
+
+ '@smithy/shared-ini-file-loader@4.4.9':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/signature-v4@5.3.14':
+ dependencies:
+ '@smithy/is-array-buffer': 4.2.2
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-hex-encoding': 4.2.2
+ '@smithy/util-middleware': 4.2.14
+ '@smithy/util-uri-escape': 4.2.2
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/smithy-client@4.12.13':
+ dependencies:
+ '@smithy/core': 3.23.17
+ '@smithy/middleware-endpoint': 4.4.32
+ '@smithy/middleware-stack': 4.2.14
+ '@smithy/protocol-http': 5.3.14
+ '@smithy/types': 4.14.1
+ '@smithy/util-stream': 4.5.25
+ tslib: 2.8.1
+
+ '@smithy/types@4.14.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/url-parser@4.2.14':
+ dependencies:
+ '@smithy/querystring-parser': 4.2.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/util-base64@4.3.2':
+ dependencies:
+ '@smithy/util-buffer-from': 4.2.2
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/util-body-length-browser@4.2.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-body-length-node@4.2.3':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-buffer-from@2.2.0':
+ dependencies:
+ '@smithy/is-array-buffer': 2.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-buffer-from@4.2.2':
+ dependencies:
+ '@smithy/is-array-buffer': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/util-config-provider@4.2.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-defaults-mode-browser@4.3.49':
+ dependencies:
+ '@smithy/property-provider': 4.2.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/util-defaults-mode-node@4.2.54':
+ dependencies:
+ '@smithy/config-resolver': 4.4.17
+ '@smithy/credential-provider-imds': 4.2.14
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/property-provider': 4.2.14
+ '@smithy/smithy-client': 4.12.13
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/util-endpoints@3.4.2':
+ dependencies:
+ '@smithy/node-config-provider': 4.3.14
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/util-hex-encoding@4.2.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-middleware@4.2.14':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/util-retry@4.3.8':
+ dependencies:
+ '@smithy/service-error-classification': 4.3.1
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/util-stream@4.5.25':
+ dependencies:
+ '@smithy/fetch-http-handler': 5.3.17
+ '@smithy/node-http-handler': 4.6.1
+ '@smithy/types': 4.14.1
+ '@smithy/util-base64': 4.3.2
+ '@smithy/util-buffer-from': 4.2.2
+ '@smithy/util-hex-encoding': 4.2.2
+ '@smithy/util-utf8': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/util-uri-escape@4.2.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@smithy/util-utf8@2.3.0':
+ dependencies:
+ '@smithy/util-buffer-from': 2.2.0
+ tslib: 2.8.1
+
+ '@smithy/util-utf8@4.2.2':
+ dependencies:
+ '@smithy/util-buffer-from': 4.2.2
+ tslib: 2.8.1
+
+ '@smithy/util-waiter@4.3.0':
+ dependencies:
+ '@smithy/types': 4.14.1
+ tslib: 2.8.1
+
+ '@smithy/uuid@1.1.2':
+ dependencies:
+ tslib: 2.8.1
+
+ '@tokenizer/inflate@0.4.1':
+ dependencies:
+ debug: 4.4.3
+ token-types: 6.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@tokenizer/token@0.3.0': {}
+
+ '@tybys/wasm-util@0.10.2':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/amqplib@0.10.8':
+ dependencies:
+ '@types/node': 24.12.2
+
+ '@types/body-parser@1.19.6':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 24.12.2
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 24.12.2
+
+ '@types/eslint-scope@3.7.7':
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.8
+
+ '@types/eslint@9.6.1':
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+
+ '@types/estree@1.0.8': {}
+
+ '@types/express-serve-static-core@5.1.1':
+ dependencies:
+ '@types/node': 24.12.2
+ '@types/qs': 6.15.0
+ '@types/range-parser': 1.2.7
+ '@types/send': 1.2.1
+
+ '@types/express@5.0.6':
+ dependencies:
+ '@types/body-parser': 1.19.6
+ '@types/express-serve-static-core': 5.1.1
+ '@types/serve-static': 2.2.0
+
+ '@types/http-errors@2.0.5': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/node@24.12.2':
+ dependencies:
+ undici-types: 7.16.0
+
+ '@types/node@25.6.0':
+ dependencies:
+ undici-types: 7.19.2
+
+ '@types/pg@8.20.0':
+ dependencies:
+ '@types/node': 24.12.2
+ pg-protocol: 1.13.0
+ pg-types: 2.2.0
+
+ '@types/qs@6.15.0': {}
+
+ '@types/range-parser@1.2.7': {}
+
+ '@types/react-dom@19.2.3(@types/react@19.2.14)':
+ dependencies:
+ '@types/react': 19.2.14
+
+ '@types/react@19.2.14':
+ dependencies:
+ csstype: 3.2.3
+
+ '@types/send@1.2.1':
+ dependencies:
+ '@types/node': 24.12.2
+
+ '@types/serve-static@2.2.0':
+ dependencies:
+ '@types/http-errors': 2.0.5
+ '@types/node': 24.12.2
+
+ '@types/swagger-ui-express@4.1.8':
+ dependencies:
+ '@types/express': 5.0.6
+ '@types/serve-static': 2.2.0
+
+ '@vitejs/plugin-react@6.0.1(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(terser@5.46.2)(tsx@4.21.0))':
+ dependencies:
+ '@rolldown/pluginutils': 1.0.0-rc.7
+ vite: 8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(terser@5.46.2)(tsx@4.21.0)
+
+ '@webassemblyjs/ast@1.14.1':
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ '@webassemblyjs/floating-point-hex-parser@1.13.2': {}
+
+ '@webassemblyjs/helper-api-error@1.13.2': {}
+
+ '@webassemblyjs/helper-buffer@1.14.1': {}
+
+ '@webassemblyjs/helper-numbers@1.13.2':
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/helper-wasm-bytecode@1.13.2': {}
+
+ '@webassemblyjs/helper-wasm-section@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ '@webassemblyjs/ieee754@1.13.2':
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ '@webassemblyjs/leb128@1.13.2':
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ '@webassemblyjs/utf8@1.13.2': {}
+
+ '@webassemblyjs/wasm-edit@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ '@webassemblyjs/wasm-gen@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wasm-opt@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ '@webassemblyjs/wasm-parser@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ '@webassemblyjs/wast-printer@1.14.1':
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ '@xtuc/ieee754@1.2.0': {}
+
+ '@xtuc/long@4.2.2': {}
+
+ abstract-logging@2.0.1: {}
+
+ accepts@2.0.0:
+ dependencies:
+ mime-types: 3.0.2
+ negotiator: 1.0.0
+
+ acorn-import-phases@1.0.4(acorn@8.16.0):
+ dependencies:
+ acorn: 8.16.0
+
+ acorn@8.16.0: {}
+
+ ajv-formats@2.1.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv-formats@3.0.1(ajv@8.18.0):
+ optionalDependencies:
+ ajv: 8.18.0
+
+ ajv-formats@3.0.1(ajv@8.20.0):
+ optionalDependencies:
+ ajv: 8.20.0
+
+ ajv-keywords@3.5.2(ajv@6.15.0):
+ dependencies:
+ ajv: 6.15.0
+
+ ajv-keywords@5.1.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+ fast-deep-equal: 3.1.3
+
+ ajv@6.15.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.18.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.1
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ ajv@8.20.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.1.1
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
+ amqplib@1.0.4:
+ dependencies:
+ buffer-more-ints: 1.0.0
+
+ ansi-colors@4.1.3: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansis@4.2.0: {}
+
+ append-field@1.0.0: {}
+
+ argparse@2.0.1: {}
+
+ array-timsort@1.0.3: {}
+
+ atomic-sleep@1.0.0: {}
+
+ avvio@9.2.0:
+ dependencies:
+ '@fastify/error': 4.2.0
+ fastq: 1.20.1
+
+ balanced-match@1.0.2: {}
+
+ balanced-match@4.0.4: {}
+
+ base64-js@1.5.1: {}
+
+ baseline-browser-mapping@2.10.27: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ body-parser@2.2.2:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 4.4.3
+ http-errors: 2.0.1
+ iconv-lite: 0.7.2
+ on-finished: 2.4.1
+ qs: 6.15.1
+ raw-body: 3.0.2
+ type-is: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ bowser@2.14.1: {}
+
+ brace-expansion@1.1.14:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@5.0.5:
+ dependencies:
+ balanced-match: 4.0.4
+
+ browserslist@4.28.2:
+ dependencies:
+ baseline-browser-mapping: 2.10.27
+ caniuse-lite: 1.0.30001791
+ electron-to-chromium: 1.5.349
+ node-releases: 2.0.38
+ update-browserslist-db: 1.2.3(browserslist@4.28.2)
+
+ buffer-from@1.1.2: {}
+
+ buffer-more-ints@1.0.0: {}
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
+ bytes@3.1.2: {}
+
+ call-bind-apply-helpers@1.0.2:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.4:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+
+ callsites@3.1.0: {}
+
+ caniuse-lite@1.0.30001791: {}
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chardet@2.1.1: {}
+
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.1.2
+
+ chrome-trace-event@1.0.4: {}
+
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
+ cli-spinners@2.9.2: {}
+
+ cli-table3@0.6.5:
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+
+ cli-width@4.1.0: {}
+
+ clone@1.0.4: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ commander@2.20.3: {}
+
+ commander@4.1.1: {}
+
+ comment-json@5.0.0:
+ dependencies:
+ array-timsort: 1.0.3
+ esprima: 4.0.1
+
+ concat-map@0.0.1: {}
+
+ concat-stream@2.0.0:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ typedarray: 0.0.6
+
+ consola@3.4.2: {}
+
+ content-disposition@1.1.0: {}
+
+ content-type@1.0.5: {}
+
+ cookie-signature@1.2.2: {}
+
+ cookie@0.7.2: {}
+
+ cookie@1.1.1: {}
+
+ cors@2.8.6:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cosmiconfig@8.3.6(typescript@5.9.3):
+ dependencies:
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ optionalDependencies:
+ typescript: 5.9.3
+
+ csstype@3.2.3: {}
+
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
+ deepmerge@4.3.1: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ depd@2.0.0: {}
+
+ dequal@2.0.3: {}
+
+ detect-libc@2.1.2: {}
+
+ drizzle-kit@0.31.10:
+ dependencies:
+ '@drizzle-team/brocli': 0.10.2
+ '@esbuild-kit/esm-loader': 2.6.5
+ esbuild: 0.25.12
+ tsx: 4.21.0
+
+ drizzle-orm@0.45.2(@types/pg@8.20.0)(pg@8.20.0):
+ optionalDependencies:
+ '@types/pg': 8.20.0
+ pg: 8.20.0
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ ee-first@1.1.1: {}
+
+ electron-to-chromium@1.5.349: {}
+
+ emoji-regex@8.0.0: {}
+
+ encodeurl@2.0.0: {}
+
+ enhanced-resolve@5.21.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
+ error-ex@1.3.4:
+ dependencies:
+ is-arrayish: 0.2.1
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-module-lexer@2.1.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ esbuild@0.18.20:
+ optionalDependencies:
+ '@esbuild/android-arm': 0.18.20
+ '@esbuild/android-arm64': 0.18.20
+ '@esbuild/android-x64': 0.18.20
+ '@esbuild/darwin-arm64': 0.18.20
+ '@esbuild/darwin-x64': 0.18.20
+ '@esbuild/freebsd-arm64': 0.18.20
+ '@esbuild/freebsd-x64': 0.18.20
+ '@esbuild/linux-arm': 0.18.20
+ '@esbuild/linux-arm64': 0.18.20
+ '@esbuild/linux-ia32': 0.18.20
+ '@esbuild/linux-loong64': 0.18.20
+ '@esbuild/linux-mips64el': 0.18.20
+ '@esbuild/linux-ppc64': 0.18.20
+ '@esbuild/linux-riscv64': 0.18.20
+ '@esbuild/linux-s390x': 0.18.20
+ '@esbuild/linux-x64': 0.18.20
+ '@esbuild/netbsd-x64': 0.18.20
+ '@esbuild/openbsd-x64': 0.18.20
+ '@esbuild/sunos-x64': 0.18.20
+ '@esbuild/win32-arm64': 0.18.20
+ '@esbuild/win32-ia32': 0.18.20
+ '@esbuild/win32-x64': 0.18.20
+
+ esbuild@0.25.12:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+
+ esbuild@0.27.7:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.7
+ '@esbuild/android-arm': 0.27.7
+ '@esbuild/android-arm64': 0.27.7
+ '@esbuild/android-x64': 0.27.7
+ '@esbuild/darwin-arm64': 0.27.7
+ '@esbuild/darwin-x64': 0.27.7
+ '@esbuild/freebsd-arm64': 0.27.7
+ '@esbuild/freebsd-x64': 0.27.7
+ '@esbuild/linux-arm': 0.27.7
+ '@esbuild/linux-arm64': 0.27.7
+ '@esbuild/linux-ia32': 0.27.7
+ '@esbuild/linux-loong64': 0.27.7
+ '@esbuild/linux-mips64el': 0.27.7
+ '@esbuild/linux-ppc64': 0.27.7
+ '@esbuild/linux-riscv64': 0.27.7
+ '@esbuild/linux-s390x': 0.27.7
+ '@esbuild/linux-x64': 0.27.7
+ '@esbuild/netbsd-arm64': 0.27.7
+ '@esbuild/netbsd-x64': 0.27.7
+ '@esbuild/openbsd-arm64': 0.27.7
+ '@esbuild/openbsd-x64': 0.27.7
+ '@esbuild/openharmony-arm64': 0.27.7
+ '@esbuild/sunos-x64': 0.27.7
+ '@esbuild/win32-arm64': 0.27.7
+ '@esbuild/win32-ia32': 0.27.7
+ '@esbuild/win32-x64': 0.27.7
+
+ escalade@3.2.0: {}
+
+ escape-html@1.0.3: {}
+
+ eslint-scope@5.1.1:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ esprima@4.0.1: {}
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@4.3.0: {}
+
+ estraverse@5.3.0: {}
+
+ etag@1.8.1: {}
+
+ events@3.3.0: {}
+
+ express@5.2.1:
+ dependencies:
+ accepts: 2.0.0
+ body-parser: 2.2.2
+ content-disposition: 1.1.0
+ content-type: 1.0.5
+ cookie: 0.7.2
+ cookie-signature: 1.2.2
+ debug: 4.4.3
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 2.1.1
+ fresh: 2.0.0
+ http-errors: 2.0.1
+ merge-descriptors: 2.0.0
+ mime-types: 3.0.2
+ on-finished: 2.4.1
+ once: 1.4.0
+ parseurl: 1.3.3
+ proxy-addr: 2.0.7
+ qs: 6.15.1
+ range-parser: 1.2.1
+ router: 2.2.0
+ send: 1.2.1
+ serve-static: 2.2.1
+ statuses: 2.0.2
+ type-is: 2.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ fast-decode-uri-component@1.0.1: {}
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-json-stringify@6.3.0:
+ dependencies:
+ '@fastify/merge-json-schemas': 0.2.1
+ ajv: 8.20.0
+ ajv-formats: 3.0.1(ajv@8.20.0)
+ fast-uri: 3.1.1
+ json-schema-ref-resolver: 3.0.0
+ rfdc: 1.4.1
+
+ fast-querystring@1.1.2:
+ dependencies:
+ fast-decode-uri-component: 1.0.1
+
+ fast-safe-stringify@2.1.1: {}
+
+ fast-uri@3.1.1: {}
+
+ fast-xml-builder@1.1.8:
+ dependencies:
+ path-expression-matcher: 1.5.0
+
+ fast-xml-parser@5.7.2:
+ dependencies:
+ '@nodable/entities': 2.1.0
+ fast-xml-builder: 1.1.8
+ path-expression-matcher: 1.5.0
+ strnum: 2.2.3
+
+ fastify@5.8.5:
+ dependencies:
+ '@fastify/ajv-compiler': 4.0.5
+ '@fastify/error': 4.2.0
+ '@fastify/fast-json-stringify-compiler': 5.0.3
+ '@fastify/proxy-addr': 5.1.0
+ abstract-logging: 2.0.1
+ avvio: 9.2.0
+ fast-json-stringify: 6.3.0
+ find-my-way: 9.5.0
+ light-my-request: 6.6.0
+ pino: 10.3.1
+ process-warning: 5.0.0
+ rfdc: 1.4.1
+ secure-json-parse: 4.1.0
+ semver: 7.7.4
+ toad-cache: 3.7.0
+
+ fastq@1.20.1:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.4):
+ optionalDependencies:
+ picomatch: 4.0.4
+
+ file-type@21.3.4:
+ dependencies:
+ '@tokenizer/inflate': 0.4.1
+ strtok3: 10.3.5
+ token-types: 6.1.2
+ uint8array-extras: 1.5.0
+ transitivePeerDependencies:
+ - supports-color
+
+ finalhandler@2.1.1:
+ dependencies:
+ debug: 4.4.3
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ find-my-way@9.5.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-querystring: 1.1.2
+ safe-regex2: 5.1.1
+
+ fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0):
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ chalk: 4.1.2
+ chokidar: 4.0.3
+ cosmiconfig: 8.3.6(typescript@5.9.3)
+ deepmerge: 4.3.1
+ fs-extra: 10.1.0
+ memfs: 3.5.3
+ minimatch: 3.1.5
+ node-abort-controller: 3.1.1
+ schema-utils: 3.3.0
+ semver: 7.7.4
+ tapable: 2.3.3
+ typescript: 5.9.3
+ webpack: 5.106.0
+
+ forwarded@0.2.0: {}
+
+ fresh@2.0.0: {}
+
+ fs-extra@10.1.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.2.1
+ universalify: 2.0.1
+
+ fs-monkey@1.1.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ get-intrinsic@1.3.0:
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.3
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-tsconfig@4.14.0:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-to-regexp@0.4.1: {}
+
+ glob@13.0.6:
+ dependencies:
+ minimatch: 10.2.5
+ minipass: 7.1.3
+ path-scurry: 2.0.2
+
+ gopd@1.2.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ has-flag@4.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ hasown@2.0.3:
+ dependencies:
+ function-bind: 1.1.2
+
+ http-errors@2.0.1:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.2
+ toidentifier: 1.0.1
+
+ iconv-lite@0.7.2:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ import-fresh@3.3.1:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ inherits@2.0.4: {}
+
+ ipaddr.js@1.9.1: {}
+
+ ipaddr.js@2.4.0: {}
+
+ is-arrayish@0.2.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-interactive@1.0.0: {}
+
+ is-promise@4.0.0: {}
+
+ is-unicode-supported@0.1.0: {}
+
+ iterare@1.2.1: {}
+
+ jest-worker@27.5.1:
+ dependencies:
+ '@types/node': 24.12.2
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.1.1:
+ dependencies:
+ argparse: 2.0.1
+
+ json-parse-even-better-errors@2.3.1: {}
+
+ json-schema-ref-resolver@3.0.0:
+ dependencies:
+ dequal: 2.0.3
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json5@2.2.3: {}
+
+ jsonc-parser@3.3.1: {}
+
+ jsonfile@6.2.1:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ light-my-request@6.6.0:
+ dependencies:
+ cookie: 1.1.1
+ process-warning: 4.0.1
+ set-cookie-parser: 2.7.2
+
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
+ lightningcss@1.32.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+
+ lines-and-columns@1.2.4: {}
+
+ load-esm@1.0.3: {}
+
+ loader-runner@4.3.2: {}
+
+ lodash@4.18.1: {}
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ lru-cache@11.3.6: {}
+
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@0.3.0: {}
+
+ media-typer@1.1.0: {}
+
+ memfs@3.5.3:
+ dependencies:
+ fs-monkey: 1.1.0
+
+ merge-descriptors@2.0.0: {}
+
+ merge-stream@2.0.0: {}
+
+ mime-db@1.52.0: {}
+
+ mime-db@1.54.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime-types@3.0.2:
+ dependencies:
+ mime-db: 1.54.0
+
+ mimic-fn@2.1.0: {}
+
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.5
+
+ minimatch@3.1.5:
+ dependencies:
+ brace-expansion: 1.1.14
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.3: {}
+
+ ms@2.1.3: {}
+
+ multer@2.1.1:
+ dependencies:
+ append-field: 1.0.0
+ busboy: 1.6.0
+ concat-stream: 2.0.0
+ type-is: 1.6.18
+
+ mute-stream@2.0.0: {}
+
+ nanoid@3.3.12: {}
+
+ negotiator@1.0.0: {}
+
+ neo-async@2.6.2: {}
+
+ node-abort-controller@3.1.1: {}
+
+ node-emoji@1.11.0:
+ dependencies:
+ lodash: 4.18.1
+
+ node-releases@2.0.38: {}
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.4: {}
+
+ on-exit-leak-free@2.1.2: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ ora@5.4.1:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-json@5.2.0:
+ dependencies:
+ '@babel/code-frame': 7.29.0
+ error-ex: 1.3.4
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ parseurl@1.3.3: {}
+
+ path-expression-matcher@1.5.0: {}
+
+ path-scurry@2.0.2:
+ dependencies:
+ lru-cache: 11.3.6
+ minipass: 7.1.3
+
+ path-to-regexp@8.4.2: {}
+
+ path-type@4.0.0: {}
+
+ pg-cloudflare@1.3.0:
+ optional: true
+
+ pg-connection-string@2.12.0: {}
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.13.0(pg@8.20.0):
+ dependencies:
+ pg: 8.20.0
+
+ pg-protocol@1.13.0: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.1
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.20.0:
+ dependencies:
+ pg-connection-string: 2.12.0
+ pg-pool: 3.13.0(pg@8.20.0)
+ pg-protocol: 1.13.0
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.3.0
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
+ picocolors@1.1.1: {}
+
+ picomatch@4.0.4: {}
+
+ pino-abstract-transport@3.0.0:
+ dependencies:
+ split2: 4.2.0
+
+ pino-std-serializers@7.1.0: {}
+
+ pino@10.3.1:
+ dependencies:
+ '@pinojs/redact': 0.4.0
+ atomic-sleep: 1.0.0
+ on-exit-leak-free: 2.1.2
+ pino-abstract-transport: 3.0.0
+ pino-std-serializers: 7.1.0
+ process-warning: 5.0.0
+ quick-format-unescaped: 4.0.4
+ real-require: 0.2.0
+ safe-stable-stringify: 2.5.0
+ sonic-boom: 4.2.1
+ thread-stream: 4.0.0
+
+ pluralize@8.0.0: {}
+
+ postcss@8.5.14:
+ dependencies:
+ nanoid: 3.3.12
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postgres-array@2.0.0: {}
+
+ postgres-bytea@1.0.1: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+
+ process-warning@4.0.1: {}
+
+ process-warning@5.0.0: {}
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ punycode@2.3.1: {}
+
+ qs@6.15.1:
+ dependencies:
+ side-channel: 1.1.0
+
+ quick-format-unescaped@4.0.4: {}
+
+ range-parser@1.2.1: {}
+
+ raw-body@3.0.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.1
+ iconv-lite: 0.7.2
+ unpipe: 1.0.0
+
+ react-dom@19.2.5(react@19.2.5):
+ dependencies:
+ react: 19.2.5
+ scheduler: 0.27.0
+
+ react@19.2.5: {}
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@4.1.2: {}
+
+ real-require@0.2.0: {}
+
+ reflect-metadata@0.2.2: {}
+
+ require-from-string@2.0.2: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ ret@0.5.0: {}
+
+ reusify@1.1.0: {}
+
+ rfdc@1.4.1: {}
+
+ rolldown@1.0.0-rc.17:
+ dependencies:
+ '@oxc-project/types': 0.127.0
+ '@rolldown/pluginutils': 1.0.0-rc.17
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-rc.17
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.17
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.17
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.17
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17
+
+ router@2.2.0:
+ dependencies:
+ debug: 4.4.3
+ depd: 2.0.0
+ is-promise: 4.0.0
+ parseurl: 1.3.3
+ path-to-regexp: 8.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.8.1
+
+ rxjs@7.8.2:
+ dependencies:
+ tslib: 2.8.1
+
+ safe-buffer@5.2.1: {}
+
+ safe-regex2@5.1.1:
+ dependencies:
+ ret: 0.5.0
+
+ safe-stable-stringify@2.5.0: {}
+
+ safer-buffer@2.1.2: {}
+
+ scheduler@0.27.0: {}
+
+ schema-utils@3.3.0:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 6.15.0
+ ajv-keywords: 3.5.2(ajv@6.15.0)
+
+ schema-utils@4.3.3:
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.20.0
+ ajv-formats: 2.1.1(ajv@8.20.0)
+ ajv-keywords: 5.1.0(ajv@8.20.0)
+
+ secure-json-parse@4.1.0: {}
+
+ semver@7.7.4: {}
+
+ send@1.2.1:
+ dependencies:
+ 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
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@2.2.1:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 1.2.1
+ transitivePeerDependencies:
+ - supports-color
+
+ set-cookie-parser@2.7.2: {}
+
+ setprototypeof@1.2.0: {}
+
+ side-channel-list@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.1
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ sonic-boom@4.2.1:
+ dependencies:
+ atomic-sleep: 1.0.0
+
+ source-map-js@1.2.1: {}
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ split2@4.2.0: {}
+
+ statuses@2.0.2: {}
+
+ streamsearch@1.1.0: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-bom@3.0.0: {}
+
+ strnum@2.2.3: {}
+
+ strtok3@10.3.5:
+ dependencies:
+ '@tokenizer/token': 0.3.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ swagger-ui-dist@5.32.4:
+ dependencies:
+ '@scarf/scarf': 1.4.0
+
+ swagger-ui-dist@5.32.5:
+ dependencies:
+ '@scarf/scarf': 1.4.0
+
+ swagger-ui-express@5.0.1(express@5.2.1):
+ dependencies:
+ express: 5.2.1
+ swagger-ui-dist: 5.32.5
+
+ symbol-observable@4.0.0: {}
+
+ tapable@2.3.3: {}
+
+ terser-webpack-plugin@5.5.0(webpack@5.106.0):
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.31
+ jest-worker: 27.5.1
+ schema-utils: 4.3.3
+ terser: 5.46.2
+ webpack: 5.106.0
+
+ terser@5.46.2:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.16.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ thread-stream@4.0.0:
+ dependencies:
+ real-require: 0.2.0
+
+ tinyglobby@0.2.16:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
+ toad-cache@3.7.0: {}
+
+ toidentifier@1.0.1: {}
+
+ token-types@6.1.2:
+ dependencies:
+ '@borewit/text-codec': 0.2.2
+ '@tokenizer/token': 0.3.0
+ ieee754: 1.2.1
+
+ tsconfig-paths-webpack-plugin@4.2.0:
+ dependencies:
+ chalk: 4.1.2
+ enhanced-resolve: 5.21.0
+ tapable: 2.3.3
+ tsconfig-paths: 4.2.0
+
+ tsconfig-paths@4.2.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ tsx@4.21.0:
+ dependencies:
+ esbuild: 0.27.7
+ get-tsconfig: 4.14.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ type-is@2.0.1:
+ dependencies:
+ content-type: 1.0.5
+ media-typer: 1.1.0
+ mime-types: 3.0.2
+
+ typedarray@0.0.6: {}
+
+ typescript@5.9.3: {}
+
+ typescript@6.0.3: {}
+
+ uid@2.0.2:
+ dependencies:
+ '@lukeed/csprng': 1.1.0
+
+ uint8array-extras@1.5.0: {}
+
+ undici-types@7.16.0: {}
+
+ undici-types@7.19.2: {}
+
+ universalify@2.0.1: {}
+
+ unpipe@1.0.0: {}
+
+ update-browserslist-db@1.2.3(browserslist@4.28.2):
+ dependencies:
+ browserslist: 4.28.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ vary@1.1.2: {}
+
+ vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(terser@5.46.2)(tsx@4.21.0):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.4
+ postcss: 8.5.14
+ rolldown: 1.0.0-rc.17
+ tinyglobby: 0.2.16
+ optionalDependencies:
+ '@types/node': 24.12.2
+ esbuild: 0.27.7
+ fsevents: 2.3.3
+ terser: 5.46.2
+ tsx: 4.21.0
+
+ watchpack@2.5.1:
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ webpack-node-externals@3.0.0: {}
+
+ webpack-sources@3.4.1: {}
+
+ webpack@5.106.0:
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.8
+ '@types/json-schema': 7.0.15
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.16.0
+ acorn-import-phases: 1.0.4(acorn@8.16.0)
+ browserslist: 4.28.2
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.21.0
+ es-module-lexer: 2.1.0
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.2
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 4.3.3
+ tapable: 2.3.3
+ terser-webpack-plugin: 5.5.0(webpack@5.106.0)
+ watchpack: 2.5.1
+ webpack-sources: 3.4.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrappy@1.0.2: {}
+
+ xtend@4.0.2: {}
+
+ yargs-parser@21.1.1: {}
+
+ yoctocolors-cjs@2.1.3: {}