diff --git a/.env.dev b/.env.dev index e338032..bf8c776 100644 --- a/.env.dev +++ b/.env.dev @@ -1,16 +1,104 @@ -LOG_LEVEL=info +# ============================================================================= +# BACKEND ENVIRONMENT CONFIGURATION +# ============================================================================= +# This file contains all environment variables used by the NestJS backend. +# Copy this file to .env and update the values according to your environment. +# ============================================================================= + +# ----------------------------------------------------------------------------- +# GENERAL CONFIGURATION +# From: apps/backend/src/config/general.config.ts +# ----------------------------------------------------------------------------- + +# Server hostname - the address or the domain name where the backend server +# will run HOSTNAME=localhost -PROTOCOL=http -PORT=3001 -REVERSE_PROXY_PORT=8081 -STORAGE_PROVIDER=filesystem -KV_STORE_URL=redis://localhost:6379 -KV_STORE_DEFAULT_TTL=0 -CORS_ALLOWED_ORIGINS=http://localhost:8081 + +# Server port - The port on which the backend server will run +# Default: 3000 +PORT=3000 + +# Frontend dev server port for 'pnpm dev' +# Should match the app's serving port: +# Local: matches PORT env variable +# Production: typically 80 (HTTP) or 443 (HTTPS) +# Behind proxy: matches reverse proxy port +REVERSE_PROXY_PORT=8080 + +# Node environment +# Valid values: development, production, test, staging +# Default: development +NODE_ENV=development + +# Pino log level +# Valid values: trace, debug, info, warn, error, fatal +LOG_LEVEL=info + +# CORS allowed origins - comma-separated list of allowed origins +# Multiple origins example: http://localhost:3000,https://app.example.com +# Default: http://localhost:3000 +CORS_ALLOWED_ORIGINS=http://localhost:3000 + +# ----------------------------------------------------------------------------- +# DATABASE CONFIGURATION +# From: apps/backend/src/config/db.config.ts +# ----------------------------------------------------------------------------- + +# PostgreSQL host address +# Default: localhost +DATABASE_HOST=localhost + +# PostgreSQL port +# Default: 5432 +DATABASE_PORT=5432 + +# Database name +# Default: app +DATABASE_NAME=app + +# Database username +# Default: dev +DATABASE_USERNAME=dev + +# Database password +# Default: dev +DATABASE_PASSWORD=dev + +# Enable SSL for database connection +# Accepts: true, false, yes, no, 1, 0 +# Default: false +DATABASE_SSL=false + +# Enable database query logging +# Useful for debugging but can be verbose in production +# Accepts: true, false, yes, no, 1, 0 +# Default: false +DATABASE_LOGGING=false + +# ----------------------------------------------------------------------------- +# AUTHENTICATION CONFIGURATION +# From: apps/backend/src/config/auth.config.ts +# ----------------------------------------------------------------------------- + +# Bcrypt salt rounds for password hashing +# Higher values are more secure but slower (10-12 recommended for production) +# Default: 10 AUTH_SALT_ROUNDS=10 -AUTH_JWT_SECRET=dev_secret123. -AUTH_JWT_ISSUER=app_starter -AUTH_JWT_COOKIE_NAME=access_token -AUTH_JWT_COOKIE_SECRET=dev_cookie_sign_secret123. -FORCE_COLOR=1 -ENABLE_TEST_API_ENDPOINTS=true + +# JWT issuer - identifies who issued the token +# Default: App +AUTH_JWT_ISSUER=App + +# JWT secret key - MUST be changed in production +# Used to sign and verify JWT tokens +# Default: auth-jwt-secret +AUTH_JWT_SECRET=auth-jwt-secret + +# JWT token expiration time +# Uses ms library format: 7d, 24h, 2h, 1m, etc. +# Default: 7d +AUTH_JWT_EXPIRES_IN=7d + +# Name of the authentication cookie +# Default: access_token +AUTH_COOKIE_NAME=access_token diff --git a/.env.example b/.env.example index 6169cc6..12db944 100644 --- a/.env.example +++ b/.env.example @@ -1,143 +1,146 @@ -# dotenv-linter:off UnorderedKey +# ============================================================================= +# BACKEND ENVIRONMENT CONFIGURATION +# ============================================================================= +# This file contains all environment variables used by the NestJS backend. +# Copy this file to .env and update the values according to your environment. +# ============================================================================= -# Logger -LOG_LEVEL=info +# ----------------------------------------------------------------------------- +# GENERAL CONFIGURATION +# From: apps/backend/src/config/general.config.ts +# ----------------------------------------------------------------------------- -# ------------------------------------------------------------------- -# Server configuration -# ------------------------------------------------------------------- -# Set to page DNS record once deployed +# Server hostname - the address or the domain name where the backend server +# will run HOSTNAME=localhost -# Server port + +# Server port - The port on which the backend server will run +# Default: 3000 PORT=3000 -# Protocol is used to generate the app URL. -# If omitted, if HOSTNAME is set to local address it will be set to http, -# otherwise it will be set to https. -PROTOCOL=http -# Port on which the app is available to the end user. In development -# mode, this configures the vite dev server which servers the application -# frontend. In production, this configures the port on which the app is -# available to the end user (443, if app is deployed with https configured). + +# Frontend dev server port for 'pnpm dev' +# Should match the app's serving port: +# Local: matches PORT env variable +# Production: typically 80 (HTTP) or 443 (HTTPS) +# Behind proxy: matches reverse proxy port REVERSE_PROXY_PORT=8080 -# If the app is behind a reverse proxy and rate limiting is enabled -# See https://expressjs.com/en/guide/behind-proxies.html -REVERSE_PROXY_TRUST=false - -# ------------------------------------------------------------------- -# Database configuration -# ------------------------------------------------------------------- -# You can pass the database connection string -DATABASE_URI=postgres://user:pass@hostname:port/database -# or individual database connection parameters -# DATABASE_NAME=app_starter -# DATABASE_USER=dev -# DATABASE_PASSWORD=dev -# DATABASE_HOST=localhost -# DATABASE_PORT=5432 -# DATABASE_ADAPTER=postgres - -# ------------------------------------------------------------------- -# In-memory store configuration -# ------------------------------------------------------------------- -# If KV_STORE_URL is omitted, in-memory store is used -# Example config: -# redis://user:pass@localhost:6379 -# See https://github.com/jaredwray/keyv/blob/main/packages/keyv/README.md#usage -KV_STORE_URL= -# ttl - time to live measured in seconds -# records do not expire by default -KV_STORE_DEFAULT_TTL=0 - -# ------------------------------------------------------------------- -# Security and authentication -# ------------------------------------------------------------------- -# Origins allowed in CORS requests. Multiple origins can be listed by using -# comma as a separator. In development, this matches vite dev server address: -CORS_ALLOWED_ORIGINS=http://localhost:8080 + +# Node environment +# Valid values: development, production, test, staging +# Default: development +NODE_ENV=development + +# Pino log level +# Valid values: trace, debug, info, warn, error, fatal +LOG_LEVEL=info + +# CORS allowed origins - comma-separated list of allowed origins +# Multiple origins example: http://localhost:3000,https://app.example.com +# Default: http://localhost:3000 +CORS_ALLOWED_ORIGINS=http://localhost:3000 + +# ----------------------------------------------------------------------------- +# DATABASE CONFIGURATION +# From: apps/backend/src/config/db.config.ts +# ----------------------------------------------------------------------------- + +# PostgreSQL host address +# Default: localhost +DATABASE_HOST=localhost + +# PostgreSQL port +# Default: 5432 +DATABASE_PORT=5432 + +# Database name +# Default: app +DATABASE_NAME=app + +# Database username +# Default: dev +DATABASE_USERNAME=dev + +# Database password +# Default: dev +DATABASE_PASSWORD=dev + +# Enable SSL for database connection +# Accepts: true, false, yes, no, 1, 0 +# Default: false +DATABASE_SSL=false + +# Enable database query logging +# Useful for debugging but can be verbose in production +# Accepts: true, false, yes, no, 1, 0 +# Default: false +DATABASE_LOGGING=false + +# ----------------------------------------------------------------------------- +# AUTHENTICATION CONFIGURATION +# From: apps/backend/src/config/auth.config.ts +# ----------------------------------------------------------------------------- + # Bcrypt salt rounds for password hashing -# For more information see https://www.npmjs.com/package/bcrypt +# Higher values are more secure but slower (10-12 recommended for production) +# Default: 10 AUTH_SALT_ROUNDS=10 -# JWT tokens are used to authenticate requests to the API. -# For more information see https://www.npmjs.com/package/jsonwebtoken. -AUTH_JWT_SECRET=example_secret123! -AUTH_JWT_ISSUER=app_starter -AUTH_JWT_COOKIE_NAME=access_token -AUTH_JWT_COOKIE_SECRET=example_cookie_sign_secret123! -# Enable rate limiting for authentication routes -# Make sure you configure REVERSE_PROXY_TRUST -ENABLE_RATE_LIMITING=false - -# ------------------------------------------------------------------- -# OIDC -# ------------------------------------------------------------------- -# Configuration can be skipped if OIDC is not used -# NUXT_PUBLIC_OIDC_ENABLED=0 -# OIDC_ALLOW_SIGNUP=0 -# NUXT_PUBLIC_OIDC_LOGIN_TEXT=Sign in with OIDC -# OIDC_DEFAULT_ROLE=ADMIN -# OIDC_CLIENT_ID= -# OIDC_CLIENT_SECRET= -# OIDC_ISSUER= -# OIDC_JWKS_URL= -# OIDC_AUTHORIZATION_ENDPOINT= -# OIDC_TOKEN_ENDPOINT= -# OIDC_USERINFO_ENDPOINT= -# NUXT_PUBLIC_OIDC_LOGOUT_ENABLED=1 -# OIDC_LOGOUT_ENDPOINT= -# Use OIDC_POST_LOGOUT_URI_KEY if OIDC provider uses post logout uri key not -# aligned with OIDC RP-Initiated Logout standard key (post_logout_redirect_uri) -# OIDC_POST_LOGOUT_URI_KEY= -# OIDC_SESSION_SECRET= - -# ------------------------------------------------------------------- -# Email configuration for sending notifications -# ------------------------------------------------------------------- -EMAIL_SENDER_NAME=App -EMAIL_SENDER_ADDRESS=app_starter@example.com -EMAIL_USER= -EMAIL_PASSWORD= -EMAIL_HOST=email-smtp.us-east-1.amazonaws.com -# Can be omitted if using SSL -EMAIL_PORT= -EMAIL_SSL=1 -EMAIL_TLS= - -# ------------------------------------------------------------------- -# File storage configuration -# ------------------------------------------------------------------- -# Supports two storage providers: Amazon S3 and filesystem. -# Can be set to amazon or filesystem -STORAGE_PROVIDER=filesystem -# If filesystem provider is used, this is the path where files will be stored -STORAGE_PATH=data -# If amazon provider is used, these are the credentials for the S3 bucket -# STORAGE_KEY= -# STORAGE_SECRET= -# STORAGE_REGION=us-east-1 -# STORAGE_BUCKET=my-bucket - -# ------------------------------------------------------------------- -# OAuth2 client credentials for authenticating with end-system -# ------------------------------------------------------------------- -# CONSUMER_CLIENT_ID=app_dev_id -# CONSUMER_CLIENT_SECRET=app_dev_secret -# CONSUMER_CLIENT_TOKEN_HOST=http://127.0.0.1:3000 -# CONSUMER_CLIENT_TOKEN_PATH=/api/oauth2/token - -# ------------------------------------------------------------------- -# Open AI configuration, optional -# ------------------------------------------------------------------- -# Backend -AI_MODEL_ID=gpt-4o -AI_SECRET_KEY= - -# ------------------------------------------------------------------- -# Test configuration -# ------------------------------------------------------------------- -# Warning: Enabling test routes will expose data manipulation endpoints -# including the ability to reset the database. -# ENABLE_TEST_API_ENDPOINTS= - -# Force color output (for logs) -# https://nodejs.org/api/tty.html#writestreamgetcolordepthenv -FORCE_COLOR=1 + +# JWT issuer - identifies who issued the token +# Default: App +AUTH_JWT_ISSUER=App + +# JWT secret key - MUST be changed in production +# Used to sign and verify JWT tokens +# Default: auth-jwt-secret +AUTH_JWT_SECRET=auth-jwt-secret + +# JWT token expiration time +# Uses ms library format: 7d, 24h, 2h, 1m, etc. +# Default: 7d +AUTH_JWT_EXPIRES_IN=7d + +# Name of the authentication cookie +# Default: access_token +AUTH_COOKIE_NAME=access_token + +# ----------------------------------------------------------------------------- +# MAIL CONFIGURATION +# From: apps/backend/src/config/mail.config.ts +# ----------------------------------------------------------------------------- + +# SMTP server host +# Default: email-smtp.us-east-1.amazonaws.com +MAIL_HOST=email-smtp.us-east-1.amazonaws.com + +# SMTP server port +# Common ports: 25 (unencrypted), 587 (TLS), 465 (SSL) +# Default: null (will use provider's default) +MAIL_PORT=587 + +# SMTP authentication username +# Leave empty if authentication is not required +# Default: empty +MAIL_USER= + +# SMTP authentication password +# Leave empty if authentication is not required +# Default: empty +MAIL_PASSWORD= + +# Use SSL/TLS for SMTP connection +# Accepts: true, false, yes, no, 1, 0 +# Default: false +MAIL_SECURE=false + +# Default sender name +# Default: App +MAIL_FROM_NAME=App + +# Default sender email address +# Default: noreply@example.com +MAIL_FROM_EMAIL=noreply@example.com + +# Sentry DSN for error tracking and performance monitoring +# Get your DSN from https://sentry.io/settings/projects/your-project/keys/ +# Leave empty to disable Sentry +# SENTRY_DSN=https://your-dsn-here@o1234567.ingest.sentry.io/1234567 diff --git a/.github/actions/run/action.yml b/.github/actions/run/action.yml index 34b6ed0..3a0eccf 100644 --- a/.github/actions/run/action.yml +++ b/.github/actions/run/action.yml @@ -5,7 +5,7 @@ runs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 22.11.0 + node-version: 24.10.0 cache: 'pnpm' cache-dependency-path: './pnpm-lock.yaml' - name: Install dependencies @@ -32,9 +32,9 @@ runs: - name: Configure env and build shell: bash run: pnpm setup:dev --ci - - name: Migrate DB + - name: Reset DB shell: bash - run: pnpm db:migrate + run: pnpm db:reset - name: Seed DB shell: bash run: pnpm seed diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 6f968e4..2debd26 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -6,7 +6,7 @@ runs: - name: Setup node to enable caching uses: actions/setup-node@v4 with: - node-version: 22.11.0 + node-version: 24.10.0 cache: 'pnpm' cache-dependency-path: './pnpm-lock.yaml' - name: Install dependencies diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 677f249..2e16a0f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -61,11 +61,11 @@ jobs: - name: Set up Node uses: actions/setup-node@v3 with: - node-version: 22 + node-version: 24.10.0 - name: Set up pnpm uses: pnpm/action-setup@v4 with: - version: 9.0.6 + version: 10.17.1 - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 0c106fc..e4b6a06 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,7 +23,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 with: - node-version: 22 + node-version: 24.10.0 cache: pnpm - name: Setup Pages uses: actions/configure-pages@v3 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 579c947..baa4c16 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,6 +1,6 @@ name: PR checks env: - PLAYWRIGHT_VERSION: 1.46.1 + PLAYWRIGHT_VERSION: 1.56.0 on: push: branches: [ main, develop ] @@ -30,52 +30,66 @@ jobs: - name: Setup app .env run: | touch .env - echo "EMAIL_SENDER_NAME=App" >> .env - echo "EMAIL_SENDER_ADDRESS=app@myappdomain.com" >> .env - echo "EMAIL_USER=${{ secrets.EMAIL_USER }}" >> .env - echo "EMAIL_PASSWORD=${{ secrets.EMAIL_PASSWORD }}" >> .env - echo "EMAIL_HOST=sandbox.smtp.mailtrap.io" >> .env - echo "NUXT_PUBLIC_OIDC_ENABLED=${{ vars.NUXT_PUBLIC_OIDC_ENABLED }}" >> .env - echo "OIDC_ALLOW_SIGNUP=${{ vars.OIDC_ALLOW_SIGNUP }}" >> .env - echo "OIDC_CLIENT_ID=${{ secrets.OIDC_CLIENT_ID }}" >> .env - echo "OIDC_CLIENT_SECRET=${{ secrets.OIDC_CLIENT_SECRET }}" >> .env - echo "OIDC_ISSUER=${{ vars.OIDC_ISSUER }}" >> .env - echo "OIDC_JWKS_URL=${{ vars.OIDC_JWKS_URL }}" >> .env - echo "OIDC_AUTHORIZATION_ENDPOINT=${{ vars.OIDC_AUTHORIZATION_ENDPOINT }}" >> .env - echo "OIDC_TOKEN_ENDPOINT=${{ vars.OIDC_TOKEN_ENDPOINT }}" >> .env - echo "OIDC_USERINFO_ENDPOINT=${{ vars.OIDC_USERINFO_ENDPOINT }}" >> .env - echo "OIDC_SESSION_SECRET=${{ secrets.OIDC_SESSION_SECRET }}" >> .env + echo "HOSTNAME=localhost" >> .env + echo "PORT=3000" >> .env + echo "REVERSE_PROXY_PORT=3000" >> .env + echo "NODE_ENV=production" >> .env + echo "LOG_LEVEL=debug" >> .env + echo "CORS_ALLOWED_ORIGINS=http://localhost:3000" >> .env + echo "DATABASE_HOST=localhost" >> .env + echo "DATABASE_PORT=5432" >> .env + echo "DATABASE_NAME=app" >> .env + echo "DATABASE_USERNAME=dev" >> .env + echo "DATABASE_PASSWORD=dev" >> .env + echo "DATABASE_SSL=false" >> .env + echo "DATABASE_LOGGING=false" >> .env + echo "AUTH_SALT_ROUNDS=10" >> .env + echo "AUTH_JWT_ISSUER=App" >> .env + echo "AUTH_JWT_SECRET=auth-jwt-secret" >> .env + echo "AUTH_JWT_EXPIRES_IN=7d" >> .env + echo "AUTH_COOKIE_NAME=access_token" >> .env + echo "MAIL_FROM_NAME=App" >> .env + echo "MAIL_FROM_EMAIL=app@myappdomain.com" >> .env + echo "MAIL_USER=${{ secrets.MAIL_USER }}" >> .env + echo "MAIL_PASSWORD=${{ secrets.MAIL_PASSWORD }}" >> .env + echo "MAIL_HOST=sandbox.smtp.mailtrap.io" >> .env + echo "MAIL_PORT=2525" >> .env + echo "MAIL_SECURE=false" >> .env - name: Setup E2E .env run: | touch ./tests/.env echo "MAILTRAP_ACCOUNT_ID=${{ secrets.MAILTRAP_ACCOUNT_ID }}" >> ./tests/.env echo "MAILTRAP_TOKEN=${{ secrets.MAILTRAP_TOKEN }}" >> ./tests/.env echo "MAILTRAP_INBOX_ID=${{ secrets.MAILTRAP_INBOX_ID }}" >> ./tests/.env - echo "MAILTRAP_INBOX_NAME=e2e" >> ./tests/.env + echo "MAILTRAP_INBOX_NAME=odma-e2e" >> ./tests/.env echo "PERCY_TOKEN=${{ secrets.PERCY_TOKEN }}" >> ./tests/.env - echo "OIDC_TEST_USER_EMAIL=${{ secrets.OIDC_TEST_USER_EMAIL }}" >> ./tests/.env - echo "OIDC_TEST_USER_PASSWORD=${{ secrets.OIDC_TEST_USER_PASSWORD }}" >> ./tests/.env + - name: Setup backend test .env + run: | + cp ./apps/backend/test.env.example ./apps/backend/.env.test - name: Install, build, seed, and start server uses: ./.github/actions/run - name: Check if platform is running uses: indiesdev/curl@v1.1 with: - url: http://localhost:3001/api/healthcheck + url: http://localhost:3000/api/healthcheck method: "GET" accept: 200 - # Disabled until configuration is provided - # - name: Run functional tests - # shell: bash - # run: pnpm e2e:functional + - name: Run integration (API) tests + shell: bash + run: cd ./apps/backend && pnpm test:e2e + - name: Run functional tests + shell: bash + run: pnpm e2e:functional + # Disabled until credentials for Percy are provided # - name: Run visual tests # shell: bash # run: pnpm e2e:visual - # - name: Run a11y tests - # shell: bash - # run: pnpm e2e:a11y - # - uses: actions/upload-artifact@v3 - # if: always() - # with: - # name: playwright-report - # path: ./tests/playwright-report/ - # retention-days: 1 + - name: Run a11y tests + shell: bash + run: pnpm e2e:a11y + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: ./tests/playwright-report/ + retention-days: 1 diff --git a/.gitignore b/.gitignore index 687e8b8..54f37d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,102 @@ -# Node -node_modules - -# IDEs and editors -.classpath -.project -/.idea -*.launch -.c9/ -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/extensions.json -!.vscode/launch.json - -# OS -.DS_Store +# Dependencies +node_modules/ +**/node_modules/ + +# Build outputs +dist/ +build/ +.output/ +.next/ +.nuxt/ +.cache/ +.parcel-cache/ -# Config +# Environment files .env +.env.* +!.env.example +**/.env +**/.env.* +!**/.env.example + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ +*.lcov +.nyc_output/ + +# Database files +*.db +*.sqlite +*.sqlite3 +database.sqlite +prisma/dev.db* + +# Uploads and temporary files +uploads/ +tmp/ +temp/ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ +.fleet/ + +# Package manager files +.pnpm-debug.log* +.yarn/ +.pnp.* +yarn-error.log + +# Test results +test-results/ +playwright-report/ +playwright/.cache/ + +# TypeScript +*.tsbuildinfo + +# Optional caches +.eslintcache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Backup files +*.backup +*.bak +*.tmp + +# Local development +.local/ +local/ + +# Generated documentation +docs/build/ diff --git a/.prettierrc b/.prettierrc index 9409967..0a6bf95 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,8 @@ { - "singleQuote": true, + "semi": true, "trailingComma": "all", - "printWidth": 80 + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "arrowParens": "always" } diff --git a/Dockerfile b/Dockerfile index f440f0d..cbd6417 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG PNPM_HOME="/root/.local/share/pnpm" -ARG PNPM_VERSION="9.0.6" +ARG PNPM_VERSION="10.17.1" FROM node:22.11.0-alpine3.18 # Prerequisites diff --git a/LICENSE b/LICENSE index 13d1021..9cf1062 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,5 @@ MIT License -Copyright (c) 2017 ExtensionEngine, LLC - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/README.md b/README.md index 7f04c98..9f1e906 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,522 @@ +# Odma +
-

App starter

+ Odma Logo + + **Full-Stack Application Template** + + *Get productive right away with auth, user management, and API-first architecture* + + > **Odma** means "right away" in Dalmatian + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.9.2-blue)](https://www.typescriptlang.org/) +[![NestJS](https://img.shields.io/badge/NestJS-11.1.6-red)](https://nestjs.com/) +[![Nuxt](https://img.shields.io/badge/Nuxt-4.1.2-green)](https://nuxt.com/) +[![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-blue)](https://www.postgresql.org/) + +
+ +--- + +## What This Is + +Odma is a full-stack application starter that includes all the foundational +components most modern applications need. Rather than starting from scratch, +you get a working system that demonstrates best practices for building scalable +web applications with proper architecture, security, testing, and deployment +infrastructure. + +The user management module serves as a practical showcase of how all the pieces +work together - from database design and API endpoints to frontend interfaces +and testing strategies. + +### What You Get + +- **Basic Auth System** - Local login/signup, JWT sessions, role-based access +- **User Management Example** - Full CRUD operations, user invitations, role management +- **API-First Architecture** - OpenAPI specification with auto-generated typed client +- **Production Security** - Input validation, rate limiting, secure headers, audit logging +- **Comprehensive Testing** - Backend API tests, E2E browser testing, visual regression, a11y +- **Monitoring & Observability** - Sentry error tracking, performance profiling, structured logging +- **Infrastructure as Code** - Docker containers, AWS deployment scripts, health monitoring +- **Development Tools** - Hot reload, type safety, automated API client generation, one-command setup + +--- + +## Technology Stack + +### Backend (`/apps/backend`) + +- **[NestJS](https://nestjs.com/)** - Node.js framework with dependency injection, decorators, and module system +- **[PostgreSQL](https://www.postgresql.org/)** - Primary database with full ACID compliance +- **[MikroORM](https://mikro-orm.io/)** - TypeScript ORM handling migrations, entities, and query building +- **[Passport.js](https://www.passportjs.org/)** - Authentication strategies for JWT tokens and local credentials +- **[Pino](https://getpino.io/)** - JSON logging with request correlation IDs +- **[Swagger/OpenAPI](https://swagger.io/)** - API specification generation from TypeScript decorators +- **[Sentry](https://sentry.io/)** - Exception tracking, performance profiling, and alerting + +### Frontend (`/apps/frontend`) + +- **[Nuxt](https://nuxt.com/)** - Vue.js meta-framework running in SPA mode +- **[Vue](https://vuejs.org/)** - Component framework with Composition API +- **[Vuetify](https://vuetifyjs.com/)** - Material Design component library with theming +- **[Pinia](https://pinia.vuejs.org/)** - Client-side state management with TypeScript support +- **[VeeValidate](https://vee-validate.logaretm.com/)** - Form validation integrated with Yup schemas +- **[Axios](https://axios-http.com/)** - HTTP client with request/response interceptors + +### Testing (`/tests`) + +- **[Playwright](https://playwright.dev/)** - Browser automation for user workflow testing +- **[Jest](https://jestjs.io/)** - Backend API integration testing with database cleanup +- **[Percy](https://percy.io/)** - Visual diff testing for UI regression detection +- **[axe-core](https://github.com/dequelabs/axe-core)** - Automated a11y compliance checking + +### Infrastructure + +- **[Docker](https://www.docker.com/)** - Containerization with multi-stage builds for optimized images +- **[Pulumi](https://www.pulumi.com/)** - TypeScript-based infrastructure provisioning for AWS + +### Tooling + +- **[PNPM](https://pnpm.io/)** - Package manager with workspace support and efficient storage +- **[ESLint](https://eslint.org/)** + **[Prettier](https://prettier.io/)** - Code linting and formatting + +--- + +## Getting Started + +### Prerequisites + +- Node.js 18+ and PNPM 8+ +- Docker and Docker Compose +- PostgreSQL 16+ (or use Docker) + +### Automated Setup + +```bash +git clone +cd odma +pnpm setup:dev +``` + +This script will: + +- Install all dependencies across workspaces +- Generate environment configuration +- Start required services (PostgreSQL, Redis) +- Run database migrations and seeding +- Launch development servers + +### Manual Setup + +```bash +# Install dependencies +pnpm i + +# Configure environment +cp .env.example .env +# Edit .env with your database credentials and API keys + +# Start services +docker-compose -f docker-compose.dev.yaml up -d + +# Setup database +pnpm --filter backend migration:up +pnpm --filter backend seeder:run + +# Start development +pnpm dev +``` + +### Access Points + +- **Frontend**: http://localhost:8080 +- **Backend API**: http://localhost:3000 +- **API Documentation**: http://localhost:3000/api/docs +- **Database**: postgresql://dev:dev@localhost:5432/odma + +--- + +## Authentication & Security + +### Authentication Methods + +- **Local Auth** - Email/password with JWT tokens +- **Session Management** - HTTP-only cookies with CSRF protection + +### Security Features + +- **Role-Based Access Control** - ADMIN and USER roles with guards +- **Input Validation** - Global validation pipes with class-validator +- **Rate Limiting** - 100 requests per minute throttling +- **XSS Protection** - Input sanitization and secure headers +- **CORS Configuration** + +### Default Users (Development) + +``` +Admin: admin@example.com / admin123! +``` + +--- + +## API-First Development + +### OpenAPI Specification + +The backend automatically generates OpenAPI specifications from NestJS decorators, providing: + +- **Live Documentation** at `/api/docs` with Swagger UI +- **Type-safe API contracts** from TypeScript DTOs +- **Request/response validation** at runtime + +### Custom API Client Generator + +One of the key innovations is the custom-built API client generator (`packages/api-client-generator`) that: + +- **Reads OpenAPI specs** from the backend and generates TypeScript clients +- **Creates typed methods** for every API endpoint with full parameter types +- **Provides both standard and raw responses** for flexibility +- **Watches for changes** in development for automatic regeneration +- **Generates TypeScript interfaces** for all DTOs and responses + +```typescript +// Auto-generated typed client with full IntelliSense +import { createApiClient } from 'app-api-client'; + +const api = await createApiClient({ axiosClient }); + +// Typed method calls with parameter validation +const user = await api.auth.login({ + body: { email: 'user@example.com', password: 'password123' }, +}); + +// Access raw Axios responses when needed +const response = await api.auth.login.raw({ body: credentials }); + +// Automatic error handling with typed errors +try { + await api.user.update({ path: { id: '123' }, body: updateData }); +} catch (error) { + console.log(error.code, error.details); // Typed error properties +} +``` + +### API Client Generation + +```bash +# Generate API client from OpenAPI spec +pnpm api:client:generate + +# Watch mode for development +pnpm api:client:watch +``` + +--- + +## Testing + +This project uses a multi-layered testing approach that validates functionality from the database layer up through complete user workflows in browsers. + +### Testing Architecture + +The testing system is designed around two main areas: + +1. **Backend integration testing** (`/apps/backend/test`) - Tests the API endpoints, business logic, and database interactions +2. **E2E testing** (`/tests`) - Tests complete user workflows through browser automation + +### Backend Integration Testing (Jest) + +```bash +# Integration tests with database +pnpm --filter backend test:e2e + +# Watch mode during development +pnpm --filter backend test:watch + +# Coverage report +pnpm --filter backend test:cov +``` + +**Test coverage includes:** + +- **Authentication API** - Login, JWT validation, password reset flows +- **User management** - CRUD operations, role assignments, soft deletion +- **Access control** - Role-based permissions and admin-only endpoints +- **Data validation** - Input sanitization and database constraints +- **Email workflows** - Password reset and invitation email sending + +**Test patterns:** + +- Each test gets a fresh database instance +- Test fixtures provide reusable authentication and user data +- API requests are made using supertest with cookie session handling +- Database state is validated alongside API responses + +### Frontend E2E Testing (Playwright) + +Browser tests validate complete user workflows across multiple browsers: + +```bash +# Run all E2E tests +pnpm test:e2e + +# Run specific test file +pnpm test:e2e tests/specs/file.ts +``` + +**Test coverage includes:** + +- **Authentication flows** - Login, logout, forgot password workflows +- **Users domain** - User management, role changes, user invitations + +### Visual & Accessibility Testing + +Additional test layers ensure UI consistency and compliance: + +```bash +# Visual regression testing +pnpm test:visual + +# Accessibility compliance +pnpm test:a11y +``` + +**Visual testing:** + +- Screenshots are captured during E2E tests +- Percy compares against baseline images +- Flags visual regressions across browsers and viewports + +**Accessibility testing:** + +- axe-core runs automated compliance checks +- Tests against WCAG 2.1 guidelines +- Validates keyboard navigation and screen reader support + +### Test Infrastructure + +**Database management:** + +- Each backend test gets an isolated database +- Migrations run automatically before tests +- Database cleanup happens after each test suite + +**Email testing:** + +- Mailtrap catches all outbound emails during testing +- Email content and delivery are validated in tests +- No actual emails are sent during test runs + +### CI/CD Integration + +The test infrastructure supports: + +- **Parallel job execution** for faster CI runs +- **Database services** in GitHub Actions +- **Cross-browser testing** with Playwright +- **Test artifacts** and reporting + +--- + +## Docker & Containerization + +### Development Services + +```bash +# Start all development services +docker-compose -f docker-compose.dev.yaml up + +# Services included: +# - PostgreSQL 16 (port 5432) +# - Redis 7.4 (port 6379) +``` + +## Infrastructure & Deployment + +### AWS Infrastructure with Pulumi + +```bash +cd infrastructure + +# Configure AWS credentials +aws configure + +# Deploy infrastructure +pulumi up + +# Outputs: VPC, RDS, Load Balancer, ECS Services +``` + +### Infrastructure Components + +- **๐ŸŒ VPC** - Isolated network with public/private subnets +- **๐Ÿ—„๏ธ RDS PostgreSQL** - Managed database with backups +- **โš–๏ธ Application Load Balancer** - SSL termination and routing +- **๐Ÿš€ ECS Fargate** - Serverless container deployment +- **๐Ÿ”’ Security Groups** - Network-level security + +### Environment Management + +- **๐Ÿ  Development** - Local Docker services +- **๐Ÿš€ Staging/Production** - AWS ECS with RDS +- **๐Ÿ”ง Configuration** - Environment-specific variables +- **๐Ÿ—๏ธ Secrets** - AWS Systems Manager Parameter Store + +--- + +## Monitoring & Observability + +### Sentry Integration + +- **๐Ÿ› Error Tracking** - Real-time exception monitoring +- **๐Ÿ“ˆ Performance Monitoring** - Request duration and database query tracking +- **๐Ÿ” Profiling** - CPU profiling for performance bottlenecks +- **๐Ÿšจ Alerting** - Email and Slack notifications + +### Health Monitoring + +- **โค๏ธ Health Checks** - `/api/health/live` and `/api/health/ready` +- **๐Ÿ“Š Metrics** - Application and infrastructure metrics +- **๐Ÿ” Request Tracing** - Correlation IDs for debugging + +--- + +## Documentation + +### VitePress Documentation Site + +```bash +# Start documentation server +pnpm docs:dev + +# Build documentation +pnpm docs:build +``` + +--- + +## Project Structure + +``` +odma/ +โ”œโ”€โ”€ ๐Ÿ“ฑ apps/ +โ”‚ โ”œโ”€โ”€ backend/ # NestJS API server +โ”‚ โ””โ”€โ”€ frontend/ # Nuxt 3 SPA client +โ”œโ”€โ”€ ๐Ÿ“ฆ packages/ # Shared libraries +โ”‚ โ”œโ”€โ”€ api-client-generator/ # Custom OpenAPI client generator +โ”‚ โ”œโ”€โ”€ app-api-client/ # Generated API client +โ”‚ โ”œโ”€โ”€ app-config/ # Environment configuration +โ”‚ โ”œโ”€โ”€ app-interfaces/ # Shared TypeScript types +โ”‚ โ”œโ”€โ”€ app-vue-components/ # Reusable Vue components +โ”‚ โ””โ”€โ”€ app-seed/ # Database seeding utilities +โ”œโ”€โ”€ ๐Ÿงช tests/ # Playwright E2E tests +โ”œโ”€โ”€ ๐Ÿ—๏ธ infrastructure/ # Pulumi AWS infrastructure +โ”œโ”€โ”€ ๐Ÿ“š docs/ # VitePress documentation +โ”œโ”€โ”€ ๐Ÿ› ๏ธ scripts/ # Development automation +โ””โ”€โ”€ ๐Ÿณ docker-compose.*.yaml # Development services +``` + +--- + +### Development Features + +- **๐Ÿ”ฅ Hot Reload** - Backend and frontend auto-restart +- **๐Ÿ” Type Safety** - End-to-end TypeScript +- **๐Ÿ“ Auto-completion** - Full IntelliSense support +- **๐Ÿšซ Pre-commit Hooks** - Automated code quality checks +- **๐Ÿ“Š Bundle Analysis** - Frontend build optimization + +--- + +## Configuration + +### Environment Variables + +Copy `.env.example` to `.env` and configure: + +--- + +## Troubleshooting + +### Common Issues + +**Port already in use:** + +```bash +# Kill process on port 3000 or 3001 +lsof -ti:3000 | xargs kill -9 +lsof -ti:3001 | xargs kill -9 +``` + +**Database connection errors:** + +```bash +# Ensure PostgreSQL is running +docker-compose -f docker-compose.dev.yaml up -d + +# Reset database if corrupted +pnpm --filter backend schema:drop +pnpm --filter backend migration:up +pnpm --filter backend seeder:run +``` + +**API client out of sync:** + +```bash +# Regenerate API client after backend changes +pnpm api:client:generate + +# Or run in watch mode during development +pnpm api:client:watch +``` + +**TypeScript errors after dependency updates:** + +```bash +# Clear all caches and reinstall +pnpm store prune +rm -rf node_modules pnpm-lock.yaml +pnpm install +``` + +**Sentry not working:** + +- Check that `SENTRY_DSN` is set in your `.env` file +- Verify the DSN is valid from your Sentry project settings +- In development, check logs for "Sentry instrumentation initialized" + +**Email not sending:** + +- Verify Mailtrap credentials in `.env` +- Check `MAIL_HOST`, `MAIL_USER`, and `MAIL_PASSWORD` are correct +- For production, configure your SMTP provider + +--- + +## License + +This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details. + +--- + +## Acknowledgments + +Built with โค๏ธ using modern open-source technologies: + +- [NestJS](https://nestjs.com/) for the robust backend framework +- [Nuxt](https://nuxt.com/) for the powerful frontend framework +- [Vuetify](https://vuetifyjs.com/) for the beautiful Material Design components +- [Playwright](https://playwright.dev/) for reliable end-to-end testing + +--- + +
+

Happy coding! ๐Ÿš€

+

+ Get Started โ€ข + Documentation โ€ข + Backend Guide โ€ข + Frontend Guide +

diff --git a/apps/backend/README.md b/apps/backend/README.md new file mode 100644 index 0000000..0db498a --- /dev/null +++ b/apps/backend/README.md @@ -0,0 +1,181 @@ +# Backend API + +Production-ready NestJS application with authentication, user management, +and security-first design. + +## ๐Ÿš€ Architecture Overview + +This backend is a well-structured NestJS application built with enterprise-grade security and scalability in mind. + +### **Core Framework & Technologies** +- **NestJS** v11.1.6 with TypeScript +- **MikroORM** v6.5.6 with PostgreSQL driver +- **Passport.js** for authentication (JWT + Local strategies) +- **Pino** for structured logging +- **Jest** for testing with comprehensive e2e test suite + +### **Key Modules** +- **Auth Module** (`src/modules/auth/`): JWT authentication, login/logout, password reset +- **User Module** (`src/modules/user/`): User CRUD operations, profile management +- **Mail Module** (`src/modules/mail/`): Email templates and sending (with Handlebars) +- **Health Module** (`src/modules/health/`): Health check endpoints + +### **Security Features** +- Global JWT authentication guard +- Role-based access control (ADMIN/USER roles) +- Input validation with class-validator +- Helmet.js for security headers +- Rate limiting with Throttler +- XSS protection validators +- Password hashing with bcrypt + +### **Database & ORM** +- PostgreSQL with MikroORM +- User entity with roles, soft delete capability +- Migration and seeding system +- Custom repository pattern + +### **Development Features** +- Swagger API documentation +- Hot reload development mode +- Comprehensive e2e test suite +- TypeScript path mapping +- Pino pretty logging for development + +## ๐Ÿ› ๏ธ Quick Start + +### 1. Setup Environment + +```bash +# Install dependencies +pnpm install + +# Configure environment (see ../../.env.example for all options) +cp ../../.env.example ../../.env +``` + +### 2. Database Setup + +```bash +# Create schema and run migrations +pnpm schema:create +pnpm migration:up + +# Seed initial data (creates admin user) +pnpm seeder:run +``` + +### 3. Start Development + +```bash +pnpm dev +``` + +API available at `http://localhost:3000/api` โ€ข Docs at `/api/docs` + +## ๐Ÿงช Testing + +Comprehensive E2E test suite covering authentication, authorization, security, +and data integrity. + +```bash +# Setup test environment (uses in-memory SQLite) +cp test.env.example .env.test + +# Run tests +pnpm test:e2e # All E2E tests +pnpm test:e2e:cov # With coverage +pnpm test:e2e:watch # Watch mode +``` + +**Coverage**: Authentication (95%+), User Management (100%), Security (100%), +API Validation (95%+) + +See [test/README.md](./test/README.md) for detailed testing documentation. + +## ๐Ÿ“ Development Scripts + +```bash +# Development +pnpm dev # Start with hot reload +pnpm start:debug # Start with debugger + +# Database +pnpm migration:create # Create migration +pnpm migration:up # Run migrations +pnpm schema:fresh # Reset database +pnpm seeder:run # Seed data + +pnpm build # Production build +``` + +## ๐Ÿ”ง Configuration + +Environment-based configuration with Joi validation. +See `../../.env.example` for all available options. + +**Key Configuration Areas**: + +- Database connection and pooling +- JWT secrets and cookie security +- SMTP email settings +- CORS and security headers +- Logging levels and formats + +## ๐Ÿ“š API Overview + +### Authentication Endpoints + +``` +POST /api/auth/login # Login with email/password +GET /api/auth/logout # Logout (clears cookies) +POST /api/auth/forgot-password # Request password reset +POST /api/auth/reset-password # Reset with token +POST /api/auth/change-password # Change password (authenticated) +``` + +### User Management (Admin Only) + +``` +GET /api/users # List with search/pagination +POST /api/users # Create user +GET /api/users/:id # Get user details +PATCH /api/users/:id # Update user +DELETE /api/users/:id # Soft delete +POST /api/users/:id/restore # Restore deleted user +``` + +### Profile Management + +``` +GET /api/me # Current user profile +PATCH /api/me # Update profile (restricted fields) +``` + +### System + +``` +GET /api/health # Health check for monitoring +``` + +## ๐Ÿš€ Production Deployment + +### Build & Environment + +```bash +pnpm build # Creates dist/ folder +``` + +**Required Environment**: Strong JWT secrets, secure database connection, +SMTP configuration, appropriate log levels. + +**Production Features**: Health checks, structured logging, Swagger docs, +rate limiting, security headers, error handling. + +## ๐Ÿค Contributing + +1. Create feature branch with comprehensive tests +2. Run full test suite: `pnpm test:e2e` +3. Lint code: `pnpm lint` +4. Ensure 90%+ test coverage +5. Follow TypeScript strict mode and NestJS patterns diff --git a/apps/backend/app.ts b/apps/backend/app.ts deleted file mode 100644 index ea9bdb5..0000000 --- a/apps/backend/app.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { fileURLToPath } from 'node:url'; -import path from 'node:path'; -import bodyParser from 'body-parser'; -import cookieParser from 'cookie-parser'; -import cors from 'cors'; -import express from 'express'; -import helmet from 'helmet'; -import history from 'connect-history-api-fallback'; -import qs from 'qs'; - -import auth from './shared/auth/index.js'; -import origin from './shared/origin.js'; -import router from './router.js'; -import { createHttpLogger } from '#logger'; -import config from '#config'; - -const { STORAGE_PATH } = process.env; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const app = express(); - -const configCookie = JSON.stringify( - Object.fromEntries( - Object.entries(process.env).filter(([key]) => - key.startsWith('NUXT_PUBLIC_'), - ), - ), -); - -if (config.general.reverseProxyPolicy) - app.set('trust proxy', config.general.reverseProxyPolicy); - -// eslint-disable-next-line @typescript-eslint/no-unused-expressions -config.auth.oidc.enabled - && (await (async () => { - const { default: consolidate } = await import('consolidate'); - const { default: session } = await import('express-session'); - app.engine('mustache', consolidate.mustache); - app.set('view engine', 'mustache'); - app.use(session(config.auth.session)); - })()); - -app.use( - helmet({ - // TODO: Reevaluate and enable, for now, disabled as it breaks a lot of things - contentSecurityPolicy: false, - }), -); - -// Patch Express 5 query parser (not parsing arrays properly). -app.use((req, _res, next) => { - const { query } = req; - if (query) Object.defineProperty(req, 'query', { value: qs.parse(query) }); - next(); -}); - -app.use(cors({ origin: config.auth.corsAllowedOrigins, credentials: true })); -app.use(cookieParser(config.auth.jwt.cookie.secret)); -app.use(bodyParser.json({ limit: '50mb' })); -app.use(bodyParser.urlencoded({ extended: true })); -app.use(auth.initialize()); -app.use(origin()); -app.use( - history({ - rewrites: [ - { - from: /^\/api\/.*$/, - to: (context) => context.parsedUrl.path, - }, - ], - }), -); -app.use( - express.static(path.join(__dirname, '../frontend/.output/public'), { - setHeaders: (res, path) => { - if (!path.endsWith('/public/index.html')) return; - return res.cookie('config', configCookie); - }, - }), -); - -if (STORAGE_PATH) app.use(express.static(STORAGE_PATH)); - -// Mount main router. -app.use('/api', createHttpLogger(), router); - -// Global error handler. -app.use(errorHandler); - -// Handle non-existing routes. -app.use((_req, res) => res.status(404).end()); - -export default app; - -function errorHandler(err, req, res, _next) { - if (!err.status || err.status === 500) { - req.log.error({ err }); - res.status(500).end(); - return; - } - const { status, message } = err; - res.status(err.status).json({ error: { status, message } }); -} diff --git a/apps/backend/config/ai.js b/apps/backend/config/ai.js deleted file mode 100644 index 1523829..0000000 --- a/apps/backend/config/ai.js +++ /dev/null @@ -1,3 +0,0 @@ -export const secretKey = process.env.AI_SECRET_KEY; -export const modelId = process.env.AI_MODEL_ID; -export const isEnabled = secretKey && modelId; diff --git a/apps/backend/config/auth.js b/apps/backend/config/auth.js deleted file mode 100644 index 1ac8402..0000000 --- a/apps/backend/config/auth.js +++ /dev/null @@ -1,48 +0,0 @@ -import { role as roleConfig } from '@app/config'; -import yn from 'yn'; - -const { env } = process; -const { user: role } = roleConfig; - -export const corsAllowedOrigins = (env.CORS_ALLOWED_ORIGINS || '') - .split(',') - .filter((s) => s) - .map((s) => s.trim()); - -export const saltRounds = parseInt(env.AUTH_SALT_ROUNDS, 10) || 10; - -export const jwt = { - cookie: { - name: env.AUTH_JWT_COOKIE_NAME || 'access_token', - secret: env.AUTH_JWT_COOKIE_SECRET, - signed: !!env.AUTH_JWT_COOKIE_SECRET, - secure: env.PROTOCOL === 'https' && env.HOSTNAME !== 'localhost', - httpOnly: true, - }, - secret: env.AUTH_JWT_SECRET, - issuer: env.AUTH_JWT_ISSUER, -}; - -export const oidc = { - enabled: yn(env.NUXT_PUBLIC_OIDC_ENABLED), - clientID: env.OIDC_CLIENT_ID, - clientSecret: env.OIDC_CLIENT_SECRET, - issuer: env.OIDC_ISSUER, - jwksURL: env.OIDC_JWKS_URL, - authorizationEndpoint: env.OIDC_AUTHORIZATION_ENDPOINT, - tokenEndpoint: env.OIDC_TOKEN_ENDPOINT, - userInfoEndpoint: env.OIDC_USERINFO_ENDPOINT, - logoutEndpoint: env.OIDC_LOGOUT_ENDPOINT, - postLogoutUriKey: env.OIDC_POST_LOGOUT_URI_KEY, - enableSignup: yn(env.OIDC_ALLOW_SIGNUP), - defaultRole: - Object.values(role).find((it) => it === env.OIDC_DEFAULT_ROLE) || role.USER, -}; - -export const session = { - resave: false, - saveUninitialized: false, - secret: env.OIDC_SESSION_SECRET, - proxy: true, - cookie: { secure: false }, -}; diff --git a/apps/backend/config/consumer.js b/apps/backend/config/consumer.js deleted file mode 100644 index 2d67d83..0000000 --- a/apps/backend/config/consumer.js +++ /dev/null @@ -1,20 +0,0 @@ -const { env } = process; - -export const clientId = env.CONSUMER_CLIENT_ID; - -export const clientSecret = env.CONSUMER_CLIENT_SECRET; - -export const tokenHost = env.CONSUMER_CLIENT_TOKEN_HOST; - -export const tokenPath = env.CONSUMER_CLIENT_TOKEN_PATH; - -export const isAuthConfigured = - clientId && clientSecret && tokenHost && tokenPath; - -export default { - isAuthConfigured, - clientId, - clientSecret, - tokenHost, - tokenPath, -}; diff --git a/apps/backend/config/database.js b/apps/backend/config/database.js deleted file mode 100644 index ceb3e61..0000000 --- a/apps/backend/config/database.js +++ /dev/null @@ -1,12 +0,0 @@ -import 'dotenv/config'; - -const config = { - url: process.env.POSTGRES_URI, - dialect: 'postgres', -}; - -export const development = config; - -export const test = config; - -export const production = config; diff --git a/apps/backend/config/general.js b/apps/backend/config/general.js deleted file mode 100644 index a3e4321..0000000 --- a/apps/backend/config/general.js +++ /dev/null @@ -1,19 +0,0 @@ -import yn from 'yn'; - -function isNumeric(input) { - if (typeof input !== 'string') return false; - return !isNaN(input) && !isNaN(parseFloat(input)); -} - -function parseProxyPolicy(policy) { - if (isNumeric(policy)) return parseInt(policy, 10); - const parsedBoolean = yn(policy); - if (parsedBoolean !== undefined) return parsedBoolean; - // If the policy is not a boolean or a number, return the original value - return policy; -} - -const env = process.env; - -export const enableRateLimiting = yn(env.ENABLE_RATE_LIMITING); -export const reverseProxyPolicy = parseProxyPolicy(env.REVERSE_PROXY_TRUST); diff --git a/apps/backend/config/index.js b/apps/backend/config/index.js deleted file mode 100644 index 1784e74..0000000 --- a/apps/backend/config/index.js +++ /dev/null @@ -1,53 +0,0 @@ -import resolveUrl from '@app/config/src/url.js'; - -import * as ai from './ai.js'; -import * as auth from './auth.js'; -import * as consumer from './consumer.js'; -import * as general from './general.js'; -import * as mail from './mail.js'; -import * as storage from './storage.js'; -import * as kvStore from './kvStore.js'; -import * as test from './test.js'; - -const env = process.env; -const isProduction = env.NODE_ENV === 'production'; -const packageName = env.npm_package_name; -const packageVersion = env.npm_package_version; - -const { hostname, protocol, port, origin } = resolveUrl(env); - -export { - packageName, - packageVersion, - isProduction, - ai, - auth, - consumer, - general, - hostname, - kvStore, - mail, - origin, - port, - protocol, - storage, - test, -}; - -export default { - packageName, - packageVersion, - isProduction, - ai, - auth, - consumer, - general, - hostname, - kvStore, - mail, - origin, - port, - protocol, - storage, - test, -}; diff --git a/apps/backend/config/kvStore.js b/apps/backend/config/kvStore.js deleted file mode 100644 index 016b654..0000000 --- a/apps/backend/config/kvStore.js +++ /dev/null @@ -1,11 +0,0 @@ -import KeyvRedis from '@keyv/redis'; - -export const providerUrl = process.env.KV_STORE_URL || undefined; -export const ttl = parseInt(process.env.KV_STORE_DEFAULT_TTL, 10) || 0; - -export const store = - providerUrl && providerUrl.startsWith('redis://') - ? new KeyvRedis(providerUrl) - : undefined; - -export const keyvDefaultConfig = { ttl, ...(store && { store }) }; diff --git a/apps/backend/config/mail.js b/apps/backend/config/mail.js deleted file mode 100644 index 60bdcfd..0000000 --- a/apps/backend/config/mail.js +++ /dev/null @@ -1,18 +0,0 @@ -import yn from 'yn'; - -export const sender = { - name: process.env.EMAIL_SENDER_NAME, - address: process.env.EMAIL_SENDER_ADDRESS, -}; - -export const user = process.env.EMAIL_USER; - -export const password = process.env.EMAIL_PASSWORD; - -export const host = process.env.EMAIL_HOST; - -export const port = process.env.EMAIL_PORT || null; - -export const ssl = yn(process.env.EMAIL_SSL); - -export const tls = yn(process.env.EMAIL_TLS); diff --git a/apps/backend/config/storage.js b/apps/backend/config/storage.js deleted file mode 100644 index 42e0508..0000000 --- a/apps/backend/config/storage.js +++ /dev/null @@ -1,14 +0,0 @@ -export const protocol = 'storage://'; -export const provider = process.env.STORAGE_PROVIDER; - -export const amazon = { - endpoint: process.env.STORAGE_ENDPOINT, - region: process.env.STORAGE_REGION, - bucket: process.env.STORAGE_BUCKET, - key: process.env.STORAGE_KEY, - secret: process.env.STORAGE_SECRET, -}; - -export const filesystem = { - path: process.env.STORAGE_PATH, -}; diff --git a/apps/backend/config/test.js b/apps/backend/config/test.js deleted file mode 100644 index 02d3056..0000000 --- a/apps/backend/config/test.js +++ /dev/null @@ -1,3 +0,0 @@ -import yn from 'yn'; - -export const isSeedApiEnabled = yn(process.env.ENABLE_TEST_API_ENDPOINTS); diff --git a/apps/backend/index.ts b/apps/backend/index.ts deleted file mode 100644 index 3b175ea..0000000 --- a/apps/backend/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable */ -import boxen, { type Options as BoxenOptions } from 'boxen'; -import Promise from 'bluebird'; - -import app from './app.ts'; -import config from '#config'; -import { createLogger } from '#logger'; - - -// This needs to be done before db models get loaded! -Promise.config({ longStackTraces: !config.isProduction }); -import database from './shared/database/index.js'; -/* eslint-enable */ - -const logger = createLogger(); -database - .initialize() - .then(() => logger.info('Database initialized')) - .then(() => app.listen(config.port)) - .then(() => { - logger.info(`Server listening on port ${config.port}`); - welcome(config.packageName, config.packageVersion); - }) - .catch((err) => logger.error({ err })); - -const message = (name, version) => `${name} v${version} ๐Ÿš€`.trim(); - -function welcome(name, version) { - const options = { - padding: 2, - margin: 1, - borderStyle: 'double', - borderColor: 'blue', - align: 'left', - } as BoxenOptions; - console.log(boxen(message(name, version), options)); -} diff --git a/apps/backend/mikro-orm.config.ts b/apps/backend/mikro-orm.config.ts new file mode 100644 index 0000000..15f7b41 --- /dev/null +++ b/apps/backend/mikro-orm.config.ts @@ -0,0 +1,26 @@ +import { defineConfig, PostgreSqlDriver } from '@mikro-orm/postgresql'; +import mikroOrmConfig from './src/config/mikro-orm.config'; +import dbConfig from './src/config/db.config'; +import * as dotenv from 'dotenv'; +import * as path from 'path'; + +dotenv.config({ path: path.resolve(__dirname, '../../.env') }); + +// Since the configs use registerAs, we need to call the returned function +// The registerAs function returns a factory function +const mikroConfigFactory = mikroOrmConfig as any; +const dbConfigFactory = dbConfig as any; + +const mikroConfig = + typeof mikroConfigFactory === 'function' + ? mikroConfigFactory() + : mikroConfigFactory; + +const databaseConfig = + typeof dbConfigFactory === 'function' ? dbConfigFactory() : dbConfigFactory; + +export default defineConfig({ + driver: PostgreSqlDriver, + ...mikroConfig, + ...databaseConfig, +} as Parameters[0]); diff --git a/apps/backend/nest-cli.json b/apps/backend/nest-cli.json new file mode 100644 index 0000000..1b72105 --- /dev/null +++ b/apps/backend/nest-cli.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json.schemastore.org/nest-cli", + "collection": "@nestjs/schematics", + "sourceRoot": "src", + "compilerOptions": { + "deleteOutDir": true, + "webpack": false, + "tsConfigPath": "tsconfig.json", + "assets": [ + { + "include": "**/*.template.html", + "outDir": "dist/src", + "watchAssets": true + }, + { + "include": "**/*.template.txt", + "outDir": "dist/src", + "watchAssets": true + } + ] + } +} \ No newline at end of file diff --git a/apps/backend/nodemon.json b/apps/backend/nodemon.json deleted file mode 100644 index 56f2e1f..0000000 --- a/apps/backend/nodemon.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "watch": ["*.*"], - "ignore": ["build", "data", "dist", "*.config.js"], - "env": { - "NODE_ENV": "development" - } -} diff --git a/apps/backend/oidc/index.js b/apps/backend/oidc/index.js deleted file mode 100644 index 53707b9..0000000 --- a/apps/backend/oidc/index.js +++ /dev/null @@ -1,61 +0,0 @@ -import express from 'express'; -import { errors as OIDCError } from 'openid-client'; -import auth from '../shared/auth/index.js'; - -import { requestLimiter } from '../shared/request/mw.js'; -import { origin } from '#config'; - -const router = express.Router(); -const { authenticate, logout } = auth; - -const ACCESS_DENIED_ROUTE = `${origin}/auth?accessDenied=`; - -const OIDCErrors = [OIDCError.OPError, OIDCError.RPError]; -const scope = ['openid', 'profile', 'email'].join(' '); - -const isResign = ({ query }) => query.resign === 'true'; -const isLogoutRequest = ({ query }) => query.action === 'logout'; -const getPromptParams = (req) => (isResign(req) ? { prompt: 'login' } : {}); - -const isOIDCError = (err) => OIDCErrors.some((Ctor) => err instanceof Ctor); - -router - .use(requestLimiter()) - .get('/', authRequestHandler) - .get('/callback', idpCallbackHandler, (_, res) => res.redirect(origin)) - .use(accessDeniedHandler); - -export default { - path: '/oidc', - router, -}; - -// Initiate login and logout actions -function authRequestHandler(req, res, next) { - const strategy = req.passport.strategy('oidc'); - if (isLogoutRequest(req)) return strategy.logout()(req, res, next); - const params = { - session: true, - scope, - ...getPromptParams(req), - }; - return authenticate('oidc', params)(req, res, next); -} - -// Triggered upon OIDC provider response -function idpCallbackHandler(req, res, next) { - if (!isLogoutRequest(req)) return login(req, res, next); - return logout({ middleware: true })(req, res, next); -} - -function accessDeniedHandler(err, _req, res, next) { - if (!isOIDCError(err)) return res.redirect(ACCESS_DENIED_ROUTE + err.email); - return next(err); -} - -function login(req, res, next) { - const params = { session: true, setCookie: true }; - authenticate('oidc', params)(req, res, (err) => - err ? next(err) : res.redirect(origin), - ); -} diff --git a/apps/backend/openapi.json b/apps/backend/openapi.json new file mode 100644 index 0000000..48312e1 --- /dev/null +++ b/apps/backend/openapi.json @@ -0,0 +1,1006 @@ +{ + "openapi": "3.0.0", + "paths": { + "/api/auth/login": { + "post": { + "operationId": "Auth_login", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginDto" + } + } + } + }, + "responses": { + "200": { + "description": "User logged in successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginResponseDto" + } + } + } + }, + "401": { + "description": "The email or password you entered is incorrect." + } + }, + "summary": "User login", + "tags": [ + "auth" + ] + } + }, + "/api/auth/logout": { + "get": { + "operationId": "Auth_logout", + "parameters": [], + "responses": { + "200": { + "description": "User logged out successfully" + } + }, + "summary": "User logout", + "tags": [ + "auth" + ] + } + }, + "/api/auth/change-password": { + "post": { + "operationId": "Auth_changePassword", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePasswordDto" + } + } + } + }, + "responses": { + "200": { + "description": "Password changed successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePasswordResponseDto" + } + } + } + }, + "400": { + "description": "Current password is incorrect!" + } + }, + "summary": "Change current password", + "tags": [ + "auth" + ] + } + }, + "/api/auth/forgot-password": { + "post": { + "operationId": "Auth_forgotPassword", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForgotPasswordDto" + } + } + } + }, + "responses": { + "200": { + "description": "Password reset email sent if user exists" + } + }, + "summary": "Request password reset", + "tags": [ + "auth" + ] + } + }, + "/api/auth/reset-password": { + "post": { + "operationId": "Auth_resetPassword", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPasswordDto" + } + } + } + }, + "responses": { + "204": { + "description": "Password reset successfully" + }, + "400": { + "description": "Invalid or expired token" + } + }, + "summary": "Reset password with token", + "tags": [ + "auth" + ] + } + }, + "/api/auth/reset-password/token-status": { + "post": { + "operationId": "Auth_validateResetToken", + "parameters": [], + "responses": { + "202": { + "description": "Token is valid" + } + }, + "summary": "Validate reset token", + "tags": [ + "auth" + ] + } + }, + "/api/me": { + "get": { + "operationId": "CurrentUser_get", + "parameters": [], + "responses": { + "200": { + "description": "Current user profile", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + } + }, + "summary": "Get current user profile", + "tags": [ + "me" + ] + }, + "patch": { + "operationId": "CurrentUser_update", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProfileDto" + } + } + } + }, + "responses": { + "200": { + "description": "Updated user profile", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + } + }, + "summary": "Update user profile", + "tags": [ + "me" + ] + } + }, + "/api/users": { + "get": { + "operationId": "User_fetch", + "parameters": [ + { + "name": "email", + "required": false, + "in": "query", + "description": "Find by exact email", + "schema": { + "example": "admin@example.com", + "type": "string" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "Search term for email, first name, or last name", + "schema": { + "example": "john", + "type": "string" + } + }, + { + "name": "includeArchived", + "required": false, + "in": "query", + "description": "Include soft-deleted users", + "schema": { + "default": false, + "example": false, + "type": "boolean" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "Page number", + "schema": { + "minimum": 1, + "default": 1, + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "Number of items per page", + "schema": { + "minimum": 1, + "maximum": 100, + "default": 20, + "type": "number" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "Field to sort by", + "schema": { + "default": "createdAt", + "type": "string", + "enum": [ + "id", + "email", + "firstName", + "lastName", + "createdAt", + "updatedAt" + ] + } + }, + { + "name": "sortOrder", + "required": false, + "in": "query", + "description": "Sort order", + "schema": { + "default": "DESC", + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + } + } + ], + "responses": { + "200": { + "description": "List of users", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUsersDto" + } + } + } + } + }, + "summary": "List users", + "tags": [ + "users" + ] + }, + "post": { + "operationId": "User_create", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateUserDto" + } + } + } + }, + "responses": { + "201": { + "description": "User created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "409": { + "description": "User already exists" + } + }, + "summary": "Create or invite user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/users/{id}": { + "get": { + "operationId": "User_get", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "404": { + "description": "User not found" + } + }, + "summary": "Get user by ID (Admin only)", + "tags": [ + "users" + ] + }, + "patch": { + "operationId": "User_update", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUserDto" + } + } + } + }, + "responses": { + "200": { + "description": "User updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "User not found" + } + }, + "summary": "Update user by ID", + "tags": [ + "users" + ] + }, + "delete": { + "operationId": "User_remove", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "User deleted successfully" + }, + "404": { + "description": "User not found" + } + }, + "summary": "Delete user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/users/{id}/restore": { + "post": { + "operationId": "User_restore", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User restored successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "404": { + "description": "User not found" + } + }, + "summary": "Restore soft-deleted user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/users/{id}/reinvite": { + "post": { + "operationId": "User_reinvite", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "202": { + "description": "Invitation sent" + }, + "404": { + "description": "User not found" + } + }, + "summary": "Reinvite user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/healthcheck": { + "get": { + "operationId": "Health_healthCheck", + "parameters": [], + "responses": { + "200": { + "description": "Service is healthy" + } + }, + "summary": "Basic health check", + "tags": [ + "health" + ] + } + }, + "/api/health/live": { + "get": { + "operationId": "Health_liveness", + "parameters": [], + "responses": { + "200": { + "description": "Service is alive" + } + }, + "summary": "Liveness probe", + "tags": [ + "health" + ] + } + }, + "/api/health/ready": { + "get": { + "operationId": "Health_readiness", + "parameters": [], + "responses": { + "200": { + "description": "Service is ready" + }, + "503": { + "description": "Service is not ready" + } + }, + "summary": "Readiness probe", + "tags": [ + "health" + ] + } + }, + "/api/sentry/debug": { + "get": { + "operationId": "Health_sentryDebug", + "parameters": [], + "responses": { + "500": { + "description": "Test error thrown for Sentry" + } + }, + "summary": "Test Sentry error capture (development only)", + "tags": [ + "health" + ] + } + }, + "/api/sentry/message": { + "get": { + "operationId": "Health_sentryMessage", + "parameters": [], + "responses": { + "200": { + "description": "Test message sent to Sentry" + } + }, + "summary": "Test Sentry message capture (development only)", + "tags": [ + "health" + ] + } + }, + "/api/seed/reset": { + "post": { + "description": "Clears all data and reseeds with base admin user. Only in non prod env.", + "operationId": "Seed_resetDatabase", + "parameters": [], + "responses": { + "200": { + "description": "Database reset successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SeedResponseDto" + } + } + } + }, + "403": { + "description": "Forbidden - not available in production" + } + }, + "summary": "Reset database with base seed data", + "tags": [ + "seed" + ] + } + }, + "/api/seed/user": { + "post": { + "description": "Creates a test user with random data", + "operationId": "Seed_seedUser", + "parameters": [], + "responses": { + "201": { + "description": "Test user created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SeedResponseDto" + } + } + } + } + }, + "summary": "Create a single test user", + "tags": [ + "seed" + ] + } + } + }, + "info": { + "title": "API", + "description": "API documentation", + "version": "1.0", + "contact": {} + }, + "tags": [ + { + "name": "auth", + "description": "Authentication endpoints" + }, + { + "name": "me", + "description": "Current user profile endpoints" + }, + { + "name": "users", + "description": "User management endpoints" + }, + { + "name": "health", + "description": "Health check endpoints" + } + ], + "servers": [], + "components": { + "securitySchemes": { + "bearer": { + "scheme": "bearer", + "bearerFormat": "JWT", + "type": "http" + } + }, + "schemas": { + "LoginDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "password": { + "type": "string", + "description": "User password", + "example": "password123", + "minLength": 8 + } + }, + "required": [ + "email", + "password" + ] + }, + "UserDto": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "email": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "USER" + ] + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "fullName": { + "type": "string" + }, + "label": { + "type": "string" + }, + "imgUrl": { + "type": "string" + }, + "createdAt": { + "format": "date-time", + "type": "string" + }, + "updatedAt": { + "format": "date-time", + "type": "string" + }, + "deletedAt": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "id", + "email", + "role", + "firstName", + "lastName", + "fullName", + "label", + "imgUrl", + "createdAt", + "updatedAt", + "deletedAt" + ] + }, + "LoginResponseDto": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/UserDto" + }, + "accessToken": { + "type": "string", + "description": "JWT access token" + }, + "expiresInMs": { + "type": "number", + "description": "Token expiration time in milliseconds" + } + }, + "required": [ + "user", + "accessToken", + "expiresInMs" + ] + }, + "ChangePasswordDto": { + "type": "object", + "properties": { + "currentPassword": { + "type": "string", + "description": "Current password", + "example": "OldPassword123" + }, + "newPassword": { + "type": "string", + "description": "New password", + "minLength": 8, + "example": "NewSecureP@ssw0rd" + } + }, + "required": [ + "currentPassword", + "newPassword" + ] + }, + "ChangePasswordResponseDto": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Success message" + } + }, + "required": [ + "message" + ] + }, + "ForgotPasswordDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address to send reset link to", + "example": "user@example.com" + } + }, + "required": [ + "email" + ] + }, + "ResetPasswordDto": { + "type": "object", + "properties": { + "token": { + "type": "string", + "description": "Password reset token", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + }, + "newPassword": { + "type": "string", + "description": "New password", + "example": "NewSecureP@ssw0rd", + "minLength": 8 + } + }, + "required": [ + "token", + "newPassword" + ] + }, + "UpdateProfileDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "firstName": { + "type": "string", + "description": "User first name", + "example": "John" + }, + "lastName": { + "type": "string", + "description": "User last name", + "example": "Doe" + }, + "imgUrl": { + "type": "string", + "description": "User avatar as data URL (base64 encoded image)", + "example": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + } + } + }, + "PaginatedUsersDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserDto" + } + }, + "total": { + "type": "number", + "description": "Total number of items", + "example": 100 + }, + "limit": { + "type": "number", + "description": "Number of items per page", + "example": 20 + }, + "page": { + "type": "number", + "description": "Current page number", + "example": 1 + }, + "totalPages": { + "type": "number", + "description": "Total number of pages", + "example": 5 + }, + "hasPrevious": { + "type": "boolean", + "description": "Has previous page", + "example": false + }, + "hasNext": { + "type": "boolean", + "description": "Has next page", + "example": true + } + }, + "required": [ + "data", + "total", + "limit", + "page", + "totalPages", + "hasPrevious", + "hasNext" + ] + }, + "CreateUserDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "firstName": { + "type": "string", + "description": "User first name", + "example": "John" + }, + "lastName": { + "type": "string", + "description": "User last name", + "example": "Doe" + }, + "role": { + "type": "string", + "description": "User role", + "enum": [ + "ADMIN", + "USER" + ], + "example": "USER" + } + }, + "required": [ + "email" + ] + }, + "UpdateUserDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "firstName": { + "type": "string", + "description": "User first name", + "example": "John" + }, + "lastName": { + "type": "string", + "description": "User last name", + "example": "Doe" + }, + "imgUrl": { + "type": "string", + "description": "User avatar as data URL (base64 encoded image)", + "example": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + "role": { + "type": "string", + "description": "User role (admin only)", + "enum": [ + "ADMIN", + "USER" + ], + "example": "USER" + } + } + }, + "SeedResponseDto": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Result message" + }, + "data": { + "type": "object", + "description": "Response data" + } + }, + "required": [ + "message" + ] + } + } + } +} \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index 9b3b2c8..a592d60 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -1,117 +1,137 @@ { - "name": "app-backend", - "version": "0.0.1", - "codename": "X", - "type": "module", - "imports": { - "#config": "./config/index.js", - "#config/*": "./config/*", - "#logger": "./shared/logger.js" - }, + "name": "app-starter/backend", + "version": "1.0.0", + "description": "NestJS backend with MikroORM", + "author": "", + "private": true, + "license": "MIT", "scripts": { - "dev": "nodemon --import ./script/preflight.js --experimental-strip-types ./index.ts || exit 0", - "start": "node --import ./script/preflight.js --experimental-strip-types ./index.ts", - "debug:server": "nodemon --inspect --import ./script/preflight.js --experimental-strip-types ./index.ts ./index.js", - "db": "node --import ./script/preflight.js ./script/sequelize.js", - "db:reset": "pnpm db drop && pnpm db create && pnpm db migrate", - "db:seed": "pnpm db seed:all", - "add:admin": "node --import ./script/preflight.js ./script/addAdmin.js", - "invite:admin": "node --import ./script/preflight.js ./script/inviteAdmin.js", - "integration:add": "node --import ./script/preflight.js ./script/addIntegration.js", - "integration:token": "node --import ./script/preflight.js ./script/generateIntegrationToken.js" + "build": "nest build", + "openapi:generate": "node scripts/generate-openapi.js", + "dev": "dotenv -e ../../.env -- nest start --watch", + "start": "dotenv -e ../../.env -- node dist/src/main", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/src/main", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json", + "test:e2e:watch": "jest --config ./test/jest-e2e.json --watch", + "test:e2e:cov": "jest --config ./test/jest-e2e.json --coverage", + "migration:create": "mikro-orm migration:create", + "migration:up": "mikro-orm migration:up", + "migration:down": "mikro-orm migration:down", + "migration:list": "mikro-orm migration:list", + "migration:check": "mikro-orm migration:check", + "schema:create": "mikro-orm schema:create --run", + "schema:drop": "mikro-orm schema:drop --run", + "schema:update": "mikro-orm schema:update --run", + "schema:fresh": "mikro-orm schema:fresh --run", + "seeder:run": "mikro-orm seeder:run", + "cache:clear": "mikro-orm cache:clear" }, "dependencies": { - "@app/config": "workspace:*", - "@app/seed": "workspace:*", - "@aws-sdk/client-s3": "^3.687.0", - "@aws-sdk/lib-storage": "^3.687.0", - "@aws-sdk/s3-request-presigner": "^3.687.0", - "@aws-sdk/util-format-url": "^3.686.0", - "@faker-js/faker": "^8.4.1", - "@keyv/redis": "^3.0.1", - "@paralleldrive/cuid2": "^2.2.2", - "JSONStream": "^1.3.5", - "auto-bind": "^5.0.1", - "axios": "^1.7.7", - "bcrypt": "^5.1.1", - "bluebird": "^3.7.2", - "body-parser": "^1.20.3", - "boxen": "^7.1.1", - "change-case": "^5.4.4", - "cheerio": "1.0.0-rc.12", - "connect-history-api-fallback": "^2.0.0", - "consolidate": "^1.0.4", + "@app/config": "workspace:^", + "@app/seed": "workspace:^", + "@mikro-orm/cli": "^6.5.8", + "@mikro-orm/core": "^6.5.8", + "@mikro-orm/migrations": "^6.5.8", + "@mikro-orm/nestjs": "^6.1.1", + "@mikro-orm/postgresql": "^6.5.8", + "@mikro-orm/reflection": "^6.5.8", + "@mikro-orm/seeder": "^6.5.8", + "@mikro-orm/sql-highlighter": "^1.0.1", + "@nestjs/common": "^11.1.6", + "@nestjs/config": "^4.0.2", + "@nestjs/core": "^11.1.6", + "@nestjs/jwt": "^11.0.1", + "@nestjs/passport": "^11.0.5", + "@nestjs/platform-express": "^11.1.6", + "@nestjs/serve-static": "^5.0.4", + "@nestjs/swagger": "^11.2.0", + "@nestjs/throttler": "^6.4.0", + "@sentry/nestjs": "^10.19.0", + "@sentry/profiling-node": "^10.19.0", + "@types/handlebars": "^4.1.0", + "bcrypt": "^6.0.0", + "casual": "^1.6.2", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.2", + "common-tags": "^1.8.2", "cookie-parser": "^1.4.7", - "cors": "^2.8.5", - "date-fns": "^2.30.0", - "dotenv": "^16.4.5", - "emailjs": "^4.0.3", - "express": "5.0.0", - "express-rate-limit": "^7.4.1", - "express-session": "^1.18.1", - "fecha": "^4.2.3", - "fs-blob-store": "^6.0.0", - "gravatar": "^1.8.2", - "hash-obj": "^4.0.0", - "hashids": "^2.3.0", - "helmet": "^7.1.0", - "html-to-text": "^9.0.5", - "http-errors": "^2.0.0", - "http-status-codes": "^2.3.0", - "jsonwebtoken": "^9.0.2", - "jszip": "^3.10.1", - "keyv": "^5.1.3", - "lodash": "^4.17.21", - "luxon": "^3.5.0", - "mime-types": "^2.1.35", - "minimist": "^1.2.8", - "mjml": "^4.15.3", - "mkdirp": "^3.0.1", - "multer": "^1.4.5-lts.1", - "mustache": "^4.2.0", - "openai": "^4.71.1", - "openid-client": "^5.7.0", - "passport": "^0.6.0", + "handlebars": "^4.7.8", + "helmet": "^8.1.0", + "joi": "^18.0.1", + "ms": "^2.1.3", + "multer": "^2.0.2", + "nestjs-pino": "^4.4.1", + "nodemailer": "^7.0.9", + "passport": "^0.7.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", - "path-exists": "^5.0.0", - "pg": "^8.13.1", - "pg-query-stream": "^4.7.1", - "pino": "^9.5.0", - "pino-http": "^10.3.0", - "pino-pretty": "^12.0.0", - "pkg-dir": "^8.0.0", - "promise-queue": "^2.2.5", - "qs": "^6.13.0", - "randomstring": "^1.3.0", - "read-pkg-up": "^10.1.0", - "safe-require": "^1.0.4", - "semver": "^7.6.3", - "sequelize": "^6.37.5", - "sequelize-replace-enum-postgres": "^1.6.0", - "simple-oauth2": "^5.1.0", - "to-case": "^2.0.0", - "untildify": "^5.0.0", - "url-join": "^5.0.0", - "url-parse": "^1.5.10", - "uuid": "^10.0.0", - "yn": "^5.0.0", - "yup": "^1.4.0" + "pino-pretty": "^13.1.2", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.2", + "swagger-ui-express": "^5.0.1", + "uuid": "^13.0.0", + "yn": "^5.1.0" }, "devDependencies": { - "@types/bluebird": "^3.5.42", - "@types/express": "^5.0.0", - "dargs": "^8.1.0", - "del-cli": "^5.1.0", - "dotenv-cli": "^7.4.2", - "nodemon": "^3.1.7", - "sequelize-cli": "^6.6.2", - "terser": "^5.36.0", - "umzug": "^3.8.2" + "@libsql/client": "^0.15.15", + "@mikro-orm/libsql": "^6.5.8", + "@nestjs/cli": "^11.0.10", + "@nestjs/schematics": "^11.0.9", + "@nestjs/testing": "^11.1.6", + "@types/bcrypt": "^6.0.0", + "@types/cookie-parser": "^1.4.9", + "@types/express": "^5.0.3", + "@types/jest": "^30.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/multer": "^2.0.0", + "@types/node": "^24.7.2", + "@types/nodemailer": "^7.0.2", + "@types/passport-jwt": "^4.0.1", + "@types/passport-local": "^1.0.38", + "@types/set-cookie-parser": "^2.4.10", + "@types/supertest": "^6.0.3", + "@types/uuid": "^11.0.0", + "dotenv-cli": "^10.0.0", + "jest": "^30.2.0", + "jsonwebtoken": "^9.0.2", + "prettier": "^3.6.2", + "set-cookie-parser": "^2.7.1", + "source-map-support": "^0.5.21", + "supertest": "^7.1.4", + "ts-jest": "^29.4.5", + "ts-loader": "^9.5.4", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.9.3" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" }, - "engines": { - "node": ">= 22.6.0", - "npm": ">= 9.6.0", - "postgres": ">= 9.4" + "mikro-orm": { + "useTsNode": true, + "configPaths": [ + "./mikro-orm.config.ts", + "./dist/mikro-orm.config.js" + ] } } diff --git a/apps/backend/router.js b/apps/backend/router.js deleted file mode 100644 index 8237f34..0000000 --- a/apps/backend/router.js +++ /dev/null @@ -1,44 +0,0 @@ -import express from 'express'; -import ai from './shared/ai/index.js'; -import authenticator from './shared/auth/index.js'; -import { extractAuthData } from './shared/auth/mw.js'; -import seedRouter from './tests/api/index.js'; -import user from './user/index.js'; -import { - ai as aiConfig, - auth as authConfig, - test as testConfig, -} from '#config'; - -const { authenticate } = authenticator; -const router = express.Router(); -router.use(processBody); -router.use(extractAuthData); - -// Public routes: -router.get('/healthcheck', (_req, res) => { - res.status(200).json({ status: 'ok' }); -}); - -router.use(user.path, user.router); - -// SSO routes: -authConfig.oidc.enabled && - (await (async () => { - const { default: oidc } = await import('./oidc/index.js'); - router.use(oidc.path, oidc.router); - })()); - -// Protected routes: -router.use(authenticate('jwt')); - -if (aiConfig.isEnabled) router.use(ai.path, ai.router); -if (testConfig.isSeedApiEnabled) router.use(seedRouter.path, seedRouter.router); - -export default router; - -function processBody(req, _res, next) { - const { body } = req; - if (body && body.email) body.email = body.email.toLowerCase(); - next(); -} diff --git a/apps/backend/script/addAdmin.js b/apps/backend/script/addAdmin.js deleted file mode 100644 index 97442c9..0000000 --- a/apps/backend/script/addAdmin.js +++ /dev/null @@ -1,28 +0,0 @@ -import 'dotenv/config'; - -import roleConfig from '@app/config/src/role.js'; - -// Dynamic import is needed in order for the `enabled` flag to be respected -const { default: db } = await import('../shared/database/index.js'); - -const { User } = db; -const { user: role } = roleConfig; - -const args = process.argv.slice(2); -if (args.length !== 2) { - console.error('You must supply two arguments - email and password'); - process.exit(1); -} - -const email = args[0]; -const password = args[1]; - -User.create({ email, password, role: role.ADMIN }) - .then((user) => { - console.log(`Administrator created: ${user.email}`); - process.exit(0); - }) - .catch((err) => { - console.error(err.message); - process.exit(1); - }); diff --git a/apps/backend/script/addIntegration.js b/apps/backend/script/addIntegration.js deleted file mode 100644 index f776c22..0000000 --- a/apps/backend/script/addIntegration.js +++ /dev/null @@ -1,25 +0,0 @@ -import 'dotenv/config'; - -import roleConfig from '@app/config/src/role.js'; - -// Dynamic import is needed in order for the `enabled` flag to be respected -const { default: db } = await import('../shared/database/index.js'); - -const { User } = db; -const { user: role } = roleConfig; - -User.findOne({ where: { role: role.INTEGRATION } }) - .then((user) => { - if (!user) return true; - console.log('Integration already exists'); - process.exit(0); - }) - .then(() => User.create({ role: role.INTEGRATION })) - .then((user) => { - console.log(`Integration user created: ${user.id}`); - process.exit(0); - }) - .catch((err) => { - console.error(err.message); - process.exit(1); - }); diff --git a/apps/backend/script/generateIntegrationToken.js b/apps/backend/script/generateIntegrationToken.js deleted file mode 100644 index 30c9a17..0000000 --- a/apps/backend/script/generateIntegrationToken.js +++ /dev/null @@ -1,17 +0,0 @@ -import 'dotenv/config'; - -// Dynamic import is needed in order for the `enabled` flag to be respected -const { default: db } = await import('../shared/database/index.js'); - -const { User } = db; - -User.findOne({ where: { role: 'INTEGRATION' } }) - .then((user) => user.createToken({})) - .then((token) => { - console.log(`Integration token generated: ${token}`); - process.exit(0); - }) - .catch((err) => { - console.error(err.message || err); - process.exit(1); - }); diff --git a/apps/backend/script/inviteAdmin.js b/apps/backend/script/inviteAdmin.js deleted file mode 100644 index 36a9542..0000000 --- a/apps/backend/script/inviteAdmin.js +++ /dev/null @@ -1,30 +0,0 @@ -import 'dotenv/config'; - -import roleConfig from '@app/config/src/role.js'; -import Deferred from '../shared/util/Deferred.js'; - -// Dynamic import is needed in order for the `enabled` flag to be respected -const { default: db } = await import('../shared/database/index.js'); - -const { User } = db; -const { user: role } = roleConfig; - -const args = process.argv.slice(2); -if (args.length !== 1) { - console.error('You must supply email'); - process.exit(1); -} - -const email = args[0]; -const mailing = new Deferred(); - -User.invite({ email, role: role.ADMIN }, mailing.callback) - .then((user) => Promise.all([user, mailing.promise])) - .then(([user]) => { - console.log(`Invitation sent to ${user.email} for Admin role.`); - process.exit(0); - }) - .catch((err) => { - console.error(err.message); - process.exit(1); - }); diff --git a/apps/backend/script/preflight.js b/apps/backend/script/preflight.js deleted file mode 100644 index a33e280..0000000 --- a/apps/backend/script/preflight.js +++ /dev/null @@ -1,41 +0,0 @@ -import path from 'node:path'; -import boxen from 'boxen'; -import dotenv from 'dotenv'; -import { packageDirectory } from 'pkg-dir'; -import { readPackageUpSync } from 'read-pkg-up'; -import semver from 'semver'; - -const { packageJson: pkg } = readPackageUpSync(); - -// App root -const appDirectory = await packageDirectory(); -// Monorepo root -const projectDirectory = await packageDirectory({ - cwd: path.join(appDirectory, '..'), -}); - -const dotenvLocation = path.join(projectDirectory, '.env'); -dotenv.config({ path: dotenvLocation }); - -(function preflight() { - const engines = pkg.engines || {}; - if (!engines.node) return; - const checkPassed = semver.satisfies(process.versions.node, engines.node); - if (checkPassed) return; - warn(engines.node); - console.error(' โœ‹ Exiting due to engine requirement check failure...\n'); - process.exit(1); -})(); - -function warn(range, current = process.version, name = pkg.name) { - const options = { - borderColor: 'red', - borderStyle: 'single', - padding: 1, - margin: 1, - float: 'left', - align: 'center', - }; - const message = `๐Ÿšจ ${name} requires node ${range}\n current version is ${current}`; - console.error(boxen(message, options)); -} diff --git a/apps/backend/script/sequelize.js b/apps/backend/script/sequelize.js deleted file mode 100644 index f7ce6d3..0000000 --- a/apps/backend/script/sequelize.js +++ /dev/null @@ -1,67 +0,0 @@ -import { createRequire } from 'node:module'; -import path from 'node:path'; -import dargs from 'dargs'; -import dotenv from 'dotenv'; -import minimist from 'minimist'; -import { packageDirectory } from 'pkg-dir'; -import safeRequire from 'safe-require'; - -// App root -const appDirectory = await packageDirectory(); -// Monorepo root -const projectDirectory = await packageDirectory({ - cwd: path.join(appDirectory, '..'), -}); -const dotenvLocation = path.join(projectDirectory, '.env'); -dotenv.config({ path: dotenvLocation }); - -const require = createRequire(import.meta.url); - -const actions = ['migrate', 'seed', 'create', 'drop']; -const isAction = (cmd) => actions.some((it) => cmd.startsWith(it)); - -// Load config. -const config = safeRequire(path.join(process.cwd(), 'sequelize.config.cjs')); -if (!config) { - console.error('Error: `sequelize.config.cjs` not found'); - process.exit(1); -} - -const argv = minimist(process.argv.slice(2)); -process.argv.length = 2; - -// Resolve command with arguments. -const args = getArgs(argv); -process.argv.push(...args); - -// Resolve options. -const options = Object.assign({}, config, getOptions(argv)); -process.argv.push(...dargs(options)); - -// Make it rain! - -require('sequelize-cli/lib/sequelize'); - -function getArgs(argv) { - let [cmd, ...args] = argv._; - if (!cmd) return args; - if (isAction(cmd)) cmd = `db:${cmd}`; - return [cmd, ...args]; -} - -function getOptions(argv) { - return reduce( - argv, - (acc, val, key) => { - if (['_', '--'].includes(key)) return acc; - return Object.assign(acc, { [key]: val }); - }, - {}, - ); -} - -function reduce(obj, callback, initialValue) { - return Object.keys(obj).reduce((acc, key) => { - return callback(acc, obj[key], key); - }, initialValue); -} diff --git a/apps/backend/scripts/generate-openapi.js b/apps/backend/scripts/generate-openapi.js new file mode 100755 index 0000000..f4002ea --- /dev/null +++ b/apps/backend/scripts/generate-openapi.js @@ -0,0 +1,41 @@ +import { resolve, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = fileURLToPath(new URL('.', import.meta.url)); +const backendDir = resolve(__dirname, '../'); + +async function generateOpenApi() { + console.log('๐Ÿ”„ Generating OpenAPI specification...'); + + try { + // Import from dist (compiled) backend code + const { AppModule } = await import( + join(backendDir, 'dist/src/app.module.js') + ); + const { NestFactory } = await import('@nestjs/core'); + const { generateOpenApiDocument, saveOpenApiSpec } = await import( + join(backendDir, 'dist/src/utils/openapi.js') + ); + // Create app instance for spec generation only + const app = await NestFactory.create(AppModule, { + logger: false, + abortOnError: false, + }); + app.setGlobalPrefix('api'); + const document = generateOpenApiDocument(app); + const success = saveOpenApiSpec(document); + await app.close(); + if (success) { + console.log('โœ… OpenAPI specification generated successfully'); + } else { + console.error('โŒ Failed to save OpenAPI specification'); + process.exit(1); + } + } catch (error) { + console.error('โŒ Error generating OpenAPI spec:', error.message); + console.log('๐Ÿ’ก Make sure the backend is built first: pnpm build'); + process.exit(1); + } +} + +generateOpenApi(); diff --git a/apps/backend/sequelize.config.cjs b/apps/backend/sequelize.config.cjs deleted file mode 100644 index ad18ecc..0000000 --- a/apps/backend/sequelize.config.cjs +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -require('dotenv').config({ path: process.env.DOTENV_CONFIG_PATH }); -const path = require('path'); - -module.exports = { - config: path.join(__dirname, './shared/database/config.js'), - seedersPath: path.join(__dirname, './shared/database/seeds'), - migrationsPath: path.join(__dirname, './shared/database/migrations'), -}; diff --git a/apps/backend/shared/ai/ai.controller.js b/apps/backend/shared/ai/ai.controller.js deleted file mode 100644 index cd71e3a..0000000 --- a/apps/backend/shared/ai/ai.controller.js +++ /dev/null @@ -1,10 +0,0 @@ -import AIService from './ai.service.js'; - -async function prompt(req, res) { - const data = await AIService.requestCompletion(req.body?.input); - res.json({ data }); -} - -export default { - prompt, -}; diff --git a/apps/backend/shared/ai/ai.service.js b/apps/backend/shared/ai/ai.service.js deleted file mode 100644 index 4ce103e..0000000 --- a/apps/backend/shared/ai/ai.service.js +++ /dev/null @@ -1,67 +0,0 @@ -import isString from 'lodash/isString.js'; -import OpenAI from 'openai'; - -import { createLogger } from '#logger'; -import { ai as aiConfig } from '#config'; - -const logger = createLogger('ai'); - -const systemPrompt = ` - The following is a conversation with an AI assistant. - The assistant is helpful, creative, clever, and very friendly. - - Rules: - - Use the User rules to generate the content - - Generated content should have a friendly tone and be easy to understand - - Generated content should not include any offensive language or content - - Only return JSON objects`; - -const parseResponse = (val) => { - const content = val?.choices?.[0]?.message?.content; - logger.info('Response content', content); - try { - if (!isString(content)) return content; - return JSON.parse(content); - } catch { - logger.info('Unable to parse response', content); - throw new Error('Invalid AI response', content); - } -}; - -class AIService { - #openai; - - constructor() { - this.#openai = new OpenAI({ apiKey: aiConfig.secretKey }); - } - - async requestCompletion(prompt) { - logger.info('Completion request', prompt); - const completion = await this.#openai.chat.completions.create({ - model: aiConfig.modelId, - temperature: 0.5, - response_format: { type: 'json_object' }, - messages: [ - { role: 'system', content: systemPrompt }, - { role: 'user', content: prompt }, - ], - }); - logger.info('Completion response', completion); - return parseResponse(completion); - } - - async generateImage(prompt) { - const { data } = await this.#openai.images.generate({ - prompt, - model: 'dall-e-3', - n: 1, // amount of images, max 1 for dall-e-3 - quality: 'hd', // 'standard' | 'hd', - size: '1024x1024', - style: 'natural', - }); - const url = new URL(data[0].url); - return url; - } -} - -export default aiConfig.secretKey ? new AIService() : {}; diff --git a/apps/backend/shared/ai/index.js b/apps/backend/shared/ai/index.js deleted file mode 100644 index 3ba6085..0000000 --- a/apps/backend/shared/ai/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -import ctrl from './ai.controller.js'; - -const router = express.Router(); - -router.post('/prompt', ctrl.prompt); - -export default { - path: '/ai', - router, -}; diff --git a/apps/backend/shared/auth/audience.js b/apps/backend/shared/auth/audience.js deleted file mode 100644 index 4160240..0000000 --- a/apps/backend/shared/auth/audience.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - Scope: { - Access: 'scope:access', - Setup: 'scope:setup', - }, -}; diff --git a/apps/backend/shared/auth/authenticator.js b/apps/backend/shared/auth/authenticator.js deleted file mode 100644 index 2e74862..0000000 --- a/apps/backend/shared/auth/authenticator.js +++ /dev/null @@ -1,83 +0,0 @@ -import { IncomingMessage } from 'http'; -import addDays from 'date-fns/addDays/index.js'; -import { Authenticator } from 'passport'; -import autobind from 'auto-bind'; -import Audience from './audience.js'; -import { auth as config } from '#config'; - -const isFunction = (arg) => typeof arg === 'function'; - -class Auth extends Authenticator { - constructor() { - super(); - autobind(this); - } - - initialize(options = {}) { - Object.defineProperty(IncomingMessage.prototype, 'passport', { - get: () => this, - }); - return super.initialize(options); - } - - authenticate(strategy, ...args) { - const [options, callback] = parseAuthenticateOptions(args); - // The passport started to be explicit about the session from v0.6.0, and since most of our - // authentication strategies are stateless, we are opting to avoid session by default - if (options.session === undefined) options.session = false; - // NOTE: Setup passport to forward errors down the middleware chain - // https://github.com/jaredhanson/passport/blob/ad5fe1df/lib/middleware/authenticate.js#L171 - if (options.failWithError !== false) options.failWithError = true; - const authenticateUser = super.authenticate(strategy, options, callback); - return (req, res, next) => { - const authenticateCallback = options.setCookie - ? this._wrapAuthenticateCallback(req, res, next, strategy) - : next; - return authenticateUser(req, res, authenticateCallback); - }; - } - - _wrapAuthenticateCallback(req, res, next, strategy) { - return (...args) => { - if (args.length > 0) return next(args[0]); - const { user } = req; - const token = user.createToken({ - audience: Audience.Scope.Access, - expiresIn: '5 days', - }); - const { name, signed, secure, httpOnly } = config.jwt.cookie; - const expires = addDays(new Date(), 5); - const options = { signed, secure, expires, httpOnly }; - res.cookie(name, token, options); - const authData = { strategy, [strategy]: user.authData }; - res.cookie('auth', authData, options); - req.authData = authData; - return next(); - }; - } - - logout({ middleware = false } = {}) { - return (_, res, next) => { - res.clearCookie(config.jwt.cookie.name); - res.clearCookie('auth'); - return middleware ? next() : res.end(); - }; - } - - strategy(strategyName) { - const strategy = this._strategy(strategyName); - if (!strategy) { - throw new Error( - `Error: Unknown authentication strategy "${strategyName}"`, - ); - } - return strategy; - } -} - -export default new Auth(); - -function parseAuthenticateOptions(args) { - if (isFunction(args[0])) return [{}, args[0]]; - return [args[0] || {}, args[1]]; -} diff --git a/apps/backend/shared/auth/index.js b/apps/backend/shared/auth/index.js deleted file mode 100644 index cfdb82f..0000000 --- a/apps/backend/shared/auth/index.js +++ /dev/null @@ -1,115 +0,0 @@ -import path from 'node:path'; -import { ExtractJwt, Strategy as JwtStrategy } from 'passport-jwt'; -import get from 'lodash/get.js'; -import jwt from 'jsonwebtoken'; -import LocalStrategy from 'passport-local'; -import db from '../database/index.js'; -import Audience from './audience.js'; -import auth from './authenticator.js'; -import OIDCStrategy from './oidc.js'; -import { auth as config, origin } from '#config'; - -const { User } = db; -const options = { - usernameField: 'email', - session: false, -}; - -auth.use( - new LocalStrategy(options, (email, password, done) => { - return User.unscoped() - .findOne({ where: { email } }) - .then((user) => user && user.authenticate(password)) - .then((user) => done(null, user || false)) - .error((err) => done(err, false)); - }), -); - -auth.use( - new JwtStrategy( - { - ...config.jwt, - audience: Audience.Scope.Access, - jwtFromRequest: ExtractJwt.fromExtractors([ - extractJwtFromCookie, - ExtractJwt.fromBodyField('token'), - ]), - secretOrKey: config.jwt.secret, - }, - verifyJWT, - ), -); - -auth.use( - 'token', - new JwtStrategy( - { - ...config.jwt, - audience: Audience.Scope.Setup, - jwtFromRequest: ExtractJwt.fromBodyField('token'), - secretOrKeyProvider, - }, - verifyJWT, - ), -); - -config.oidc.enabled && - auth.use( - 'oidc', - new OIDCStrategy( - { - ...config.oidc, - callbackURL: apiUrl('/oidc/callback'), - }, - verifyOIDC, - ), - ); - -auth.serializeUser((user, done) => done(null, user)); -auth.deserializeUser((user, done) => done(null, user)); - -export default auth; - -function verifyJWT(payload, done) { - return User.unscoped() - .findByPk(payload.id) - .then((user) => done(null, user || false)) - .error((err) => done(err, false)); -} - -function verifyOIDC(tokenSet, profile, done) { - return findOrCreateOIDCUser(profile) - .then((user) => { - user.authData = { tokenSet }; - done(null, user); - }) - .catch((err) => done(Object.assign(err, { email: profile.email }), false)); -} - -function extractJwtFromCookie(req) { - const path = config.jwt.cookie.signed ? 'signedCookies' : 'cookies'; - return get(req[path], config.jwt.cookie.name, null); -} - -function secretOrKeyProvider(_, rawToken, done) { - const { id } = jwt.decode(rawToken) || {}; - return User.unscoped() - .findByPk(id, { rejectOnEmpty: true }) - .then((user) => user.getTokenSecret()) - .then((secret) => done(null, secret)) - .catch((err) => done(err)); -} - -function apiUrl(pathname) { - return new URL(path.join('/api', pathname), origin).href; -} - -function findOrCreateOIDCUser({ email, firstName, lastName }) { - if (!config.oidc.enableSignup) { - return User.findOne({ where: { email }, rejectOnEmpty: true }); - } - const defaults = { firstName, lastName, role: config.oidc.defaultRole }; - return User.findOrCreate({ where: { email }, defaults }).then( - ([user]) => user, - ); -} diff --git a/apps/backend/shared/auth/mw.js b/apps/backend/shared/auth/mw.js deleted file mode 100644 index cdb84fa..0000000 --- a/apps/backend/shared/auth/mw.js +++ /dev/null @@ -1,23 +0,0 @@ -import get from 'lodash/get.js'; -import roleConfig from '@app/config/src/role.js'; -import { StatusCodes } from 'http-status-codes'; -import { createError } from '../error/helpers.js'; -import { auth as authConfig } from '#config'; - -const { user: role } = roleConfig; - -function authorize(...allowed) { - allowed.push(role.ADMIN); - return ({ user }, _res, next) => { - if (user && allowed.includes(user.role)) return next(); - return createError(StatusCodes.UNAUTHORIZED, 'Access restricted'); - }; -} - -function extractAuthData(req, _res, next) { - const path = authConfig.jwt.cookie.signed ? 'signedCookies' : 'cookies'; - req.authData = get(req[path], 'auth', null); - return next(); -} - -export { authorize, extractAuthData }; diff --git a/apps/backend/shared/auth/oidc.js b/apps/backend/shared/auth/oidc.js deleted file mode 100644 index ed72af7..0000000 --- a/apps/backend/shared/auth/oidc.js +++ /dev/null @@ -1,86 +0,0 @@ -import { URL } from 'node:url'; -import { Strategy as BaseOIDCStrategy, Issuer } from 'openid-client'; - -export default class OIDCStrategy extends BaseOIDCStrategy { - constructor(options, verify) { - const issuer = createIssuer(options); - const client = createClient(issuer, options); - super({ client }, function (tokenSet, userInfo, done) { - const profile = parseUserInfo(userInfo); - return verify.call(this, tokenSet, profile, done); - }); - this.options = options; - } - - get client() { - return this._client; - } - - get issuer() { - return this._issuer; - } - - get isLogoutEnabled() { - return this.options.logoutEnabled; - } - - logoutUrl({ oidcData, ...params } = {}) { - const { client } = this; - const url = new URL( - client.endSessionUrl({ - ...params, - client_id: client.client_id, - id_token_hint: oidcData.tokenSet.id_token, - }), - ); - const customRedirectUriKey = this.options.postLogoutUriKey; - if (!customRedirectUriKey) return url.href; - const redirectUri = url.searchParams.get('post_logout_redirect_uri'); - url.searchParams.set(customRedirectUriKey, redirectUri); - return url.href; - } - - logout(params) { - return (req, res) => { - req.logout(() => { - const { oidc: oidcData } = req.authData || {}; - res.redirect(this.logoutUrl({ ...params, oidcData })); - }); - }; - } -} - -function createIssuer(options) { - return new Issuer({ - issuer: options.issuer, - jwks_uri: options.jwksURL, - authorization_endpoint: options.authorizationEndpoint, - token_endpoint: options.tokenEndpoint, - userinfo_endpoint: options.userInfoEndpoint, - end_session_endpoint: options.logoutEndpoint, - }); -} - -function createClient(issuer, { callbackURL, clientID, clientSecret }) { - const redirectUri = new URL(callbackURL); - const postLogoutRedirectUri = new URL(callbackURL); - postLogoutRedirectUri.searchParams.set('action', 'logout'); - return new issuer.Client({ - client_id: clientID, - client_secret: clientSecret, - redirect_uris: [redirectUri.href], - post_logout_redirect_uris: [postLogoutRedirectUri.href], - response_types: ['code'], - }); -} - -function parseUserInfo(userInfo) { - return { - id: userInfo.sub, - username: userInfo.username, - email: userInfo.email, - firstName: userInfo.given_name, - lastName: userInfo.family_name, - verified: userInfo.email_verified, - }; -} diff --git a/apps/backend/shared/database/config.js b/apps/backend/shared/database/config.js deleted file mode 100644 index 24668b6..0000000 --- a/apps/backend/shared/database/config.js +++ /dev/null @@ -1,46 +0,0 @@ -import 'dotenv/config'; -import yn from 'yn'; - -import { createLogger, Level } from '#logger'; - -const isProduction = process.env.NODE_ENV === 'production'; -const logger = createLogger('db', { level: Level.DEBUG }); - -const config = parseConfig(); -const migrationStorageTableName = 'sequelize_meta'; -const benchmark = !isProduction; - -function logging(query, time) { - const info = { query }; - if (time) info.duration = `${time}ms`; - return logger.debug(info); -} - -export default { - ...config, - migrationStorageTableName, - benchmark, - logging, -}; - -function parseConfig(config = process.env) { - const DATABASE_URI = config.DATABASE_URI || config.POSTGRES_URI; - if (DATABASE_URI) return { url: DATABASE_URI }; - if (!config.DATABASE_NAME) { - throw new TypeError( - `Invalid \`DATABASE_NAME\` provided: ${config.DATABASE_NAME}`, - ); - } - const dialectOptions = yn(config.DATABASE_SSL) - ? { ssl: { require: true, rejectUnauthorized: false } } - : {}; - return { - database: config.DATABASE_NAME, - username: config.DATABASE_USER, - password: config.DATABASE_PASSWORD, - host: config.DATABASE_HOST, - port: config.DATABASE_PORT, - dialect: config.DATABASE_ADAPTER || 'postgres', - dialectOptions, - }; -} diff --git a/apps/backend/shared/database/helpers.js b/apps/backend/shared/database/helpers.js deleted file mode 100644 index f72c56f..0000000 --- a/apps/backend/shared/database/helpers.js +++ /dev/null @@ -1,113 +0,0 @@ -import { Op, Sequelize, Utils } from 'sequelize'; -import get from 'lodash/get.js'; -import has from 'lodash/has.js'; -import inRange from 'lodash/inRange.js'; -import last from 'lodash/last.js'; -import mapValues from 'lodash/mapValues.js'; - -const { SequelizeMethod } = Utils; -const isFunction = (arg) => typeof arg === 'function'; -const notEmpty = (input) => input.length > 0; -const sql = { concat, where }; - -export { sql, getValidator, setLogging, wrapMethods, parsePath }; - -export function build(Model) { - return { - column: (col, model) => dbColumn(col, model || Model), - ...mapValues(sqlFunctions, (it) => buildSqlFunc(it, Model)), - }; -} - -const dbColumn = (col, Model) => { - if (col instanceof SequelizeMethod) return col; - const name = get(Model, `rawAttributes.${col}.field`, col); - return Sequelize.col(name); -}; - -function parsePath(path, Model) { - if (!path.includes('.')) return [dbColumn(path, Model)]; - const [alias, ...columns] = path.split('.'); - const { target: model } = Model.associations[alias]; - return [{ model, as: alias }, ...parsePath(columns.join('.'), model)]; -} - -const sqlFunctions = { - min: 'MIN', - max: 'MAX', - average: 'AVG', - count: 'COUNT', - distinct: 'DISTINCT', - sum: 'SUM', -}; - -function buildSqlFunc(name, Model) { - return (col, model) => Sequelize.fn(name, dbColumn(col, model || Model)); -} - -function getValidator(Model, attribute) { - return function validate(input) { - const validator = Model.prototype.validators[attribute]; - if (!validator || !validator.len) { - return notEmpty(input) || `"${attribute}" can not be empty`; - } - const [min, max] = validator.len; - return ( - inRange(input.length, min, max) || - `"${attribute}" must be between ${min} and ${max} characters long` - ); - }; -} - -function setLogging(Model, state) { - const { options } = Model.sequelize; - options.logging = state; - return options.logging; -} - -function concat(...args) { - const options = has(last(args), 'separator') ? args.pop() : {}; - if (!options.separator) return Sequelize.fn('concat', ...args); - return Sequelize.fn('concat_ws', options.separator, ...args); -} - -// NOTE: Fixes https://github.com/sequelize/sequelize/issues/6440 -function where(attribute, logic, options = {}) { - const { comparator = '=', scope = false } = options; - const where = Sequelize.where(attribute, comparator, logic); - return !scope ? where : { [Op.and]: [where] }; -} - -function wrapMethods(Model, Promise) { - let Ctor = Model; - do { - const methods = getMethods(Ctor.prototype); - const staticMethods = getMethods(Ctor); - [...methods, ...staticMethods].forEach((method) => - wrapMethod(method, Promise), - ); - Ctor = Object.getPrototypeOf(Ctor); - } while (Ctor !== Sequelize.Model && Ctor !== Function.prototype); - return Model; -} - -function wrapMethod({ key, value, target }, Promise) { - target[key] = function () { - const result = value.apply(this, arguments); - if (!result || !isFunction(result.catch)) return result; - return Promise.resolve(result); - }; -} - -function getMethods(object) { - return getProperties(object).filter( - ({ key, value }) => isFunction(value) && key !== 'constructor', - ); -} - -function getProperties(object) { - return Reflect.ownKeys(object).map((key) => { - const { value } = Reflect.getOwnPropertyDescriptor(object, key); - return { key, value, target: object }; - }); -} diff --git a/apps/backend/shared/database/hooks.js b/apps/backend/shared/database/hooks.js deleted file mode 100644 index a21756a..0000000 --- a/apps/backend/shared/database/hooks.js +++ /dev/null @@ -1,12 +0,0 @@ -import { hooks } from 'sequelize/lib/hooks'; -import mapValues from 'lodash/mapValues.js'; - -const Hooks = mapValues(hooks, (_, key) => key); - -Hooks.withType = (hookType, hook) => { - return function (...args) { - return hook.call(this, hookType, ...args); - }; -}; - -export default Hooks; diff --git a/apps/backend/shared/database/index.js b/apps/backend/shared/database/index.js deleted file mode 100644 index 4fe4ceb..0000000 --- a/apps/backend/shared/database/index.js +++ /dev/null @@ -1,167 +0,0 @@ -import { createRequire } from 'node:module'; -import path from 'node:path'; -import invoke from 'lodash/invoke.js'; -import forEach from 'lodash/forEach.js'; -import { SequelizeStorage, Umzug } from 'umzug'; -import pick from 'lodash/pick.js'; -import Promise from 'bluebird'; -import semver from 'semver'; -import Sequelize from 'sequelize'; -import sequelizeConfig from '../../sequelize.config.cjs'; - -// Require models. - -import User from '../../user/user.model.js'; -import Hooks from './hooks.js'; -import config from './config.js'; -import { wrapMethods } from './helpers.js'; -import { createLogger } from '#logger'; - -const require = createRequire(import.meta.url); -const pkg = require('../../package.json'); - -const logger = createLogger('db'); -const isProduction = process.env.NODE_ENV === 'production'; -const sequelize = createConnection(config); -const { migrationsPath } = sequelizeConfig; - -function initialize() { - const umzug = new Umzug({ - context: sequelize.getQueryInterface(), - storage: new SequelizeStorage({ - sequelize, - tableName: config.migrationStorageTableName, - }), - migrations: { - glob: path.join(migrationsPath, '*.js'), - resolve: ({ name, path, context }) => { - // Sequilize-CLI generates migrations that require - // two parameters be passed to the up and down methods - // but by default Umzug will only pass the first - const migration = require(path || ''); - return { - name, - up: async () => migration.up(context, Sequelize), - down: async () => migration.down(context, Sequelize), - }; - }, - }, - logger, - }); - - umzug.on('migrating', (m) => - logger.info({ migration: m }, 'โฌ†๏ธ Migrating:', m), - ); - umzug.on('migrated', (m) => - logger.info({ migration: m }, 'โฌ†๏ธ Migrated:', m), - ); - umzug.on('reverting', (m) => - logger.info({ migration: m }, 'โฌ‡๏ธ Reverting:', m), - ); - umzug.on('reverted', (m) => - logger.info({ migration: m }, 'โฌ‡๏ธ Reverted:', m), - ); - - return sequelize - .authenticate() - .then(() => logger.info(getConfig(sequelize), '๐Ÿ—„๏ธ Connected to database')) - .then(() => checkPostgreVersion(sequelize)) - .then(() => !isProduction && umzug.up()) - .then(() => umzug.executed()) - .then((migrations) => { - const files = migrations.map((it) => it.name); - if (!files.length) return; - logger.info( - { migrations: files }, - '๐Ÿ—„๏ธ Executed migrations:\n', - files.join('\n'), - ); - }); -} - -/** - * Revision needs to be before Content Element to ensure its hooks are triggered - * first. This is a temporary fix until a new system for setting up hooks is in - * place. - */ -const models = { - User: defineModel(User), -}; - -function defineModel(Model, connection = sequelize) { - const { DataTypes } = connection.Sequelize; - const fields = invoke(Model, 'fields', DataTypes, connection) || {}; - const options = invoke(Model, 'options') || {}; - Object.assign(options, { sequelize: connection }); - return Model.init(fields, options); -} - -forEach(models, (model) => { - invoke(model, 'associate', models); - addHooks(model, Hooks, models); - addScopes(model, models); - wrapMethods(model, Promise); -}); - -function addHooks(model, Hooks, models) { - const hooks = invoke(model, 'hooks', Hooks, models); - forEach(hooks, (it, type) => model.addHook(type, it)); -} - -function addScopes(model, models) { - const scopes = invoke(model, 'scopes', models); - forEach(scopes, (it, name) => model.addScope(name, it, { override: true })); -} - -const db = { - Sequelize, - sequelize, - initialize, - ...models, -}; - -wrapMethods(Sequelize.Model, Promise); -// Patch Sequelize#method to support getting models by class name. -sequelize.model = (name) => sequelize.models[name] || db[name]; - -function createConnection(config) { - if (!config.url) return new Sequelize(config); - return new Sequelize(config.url, config); -} - -function getConfig(sequelize) { - // NOTE: List public fields: https://git.io/fxVG2 - return pick(sequelize.config, [ - 'database', - 'username', - 'host', - 'port', - 'protocol', - 'pool', - 'native', - 'ssl', - 'replication', - 'dialectModulePath', - 'keepDefaultTimezone', - 'dialectOptions', - ]); -} - -function checkPostgreVersion(sequelize) { - return sequelize - .getQueryInterface() - .databaseVersion() - .then((version) => { - logger.info({ version }, 'PostgreSQL version:', version); - const range = pkg.engines && pkg.engines.postgres; - if (!range) return; - if (semver.satisfies(semver.coerce(version), range)) return; - const err = new Error(`"${pkg.name}" requires PostgreSQL ${range}`); - logger.error({ version, required: range }, err.message); - return Promise.reject(err); - }); -} - -export { Sequelize, sequelize, initialize, models }; - -export default db; diff --git a/apps/backend/shared/database/migrations/20181115140901-create-user.js b/apps/backend/shared/database/migrations/20181115140901-create-user.js deleted file mode 100644 index 1834274..0000000 --- a/apps/backend/shared/database/migrations/20181115140901-create-user.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const TABLE_NAME = 'user'; - -module.exports = { - up: async (qi, Sequelize) => { - await qi.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'); - await qi.createTable(TABLE_NAME, { - id: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - }, - uid: { - type: Sequelize.UUID, - unique: true, - allowNull: false, - defaultValue: Sequelize.literal('uuid_generate_v4()'), - }, - email: { - type: Sequelize.STRING, - unique: true, - }, - password: { - type: Sequelize.STRING, - }, - role: { - type: Sequelize.ENUM('ADMIN', 'USER', 'INTEGRATION'), - }, - first_name: { type: Sequelize.STRING(50) }, - last_name: { type: Sequelize.STRING(50) }, - img_url: { type: Sequelize.TEXT }, - createdAt: { - type: Sequelize.DATE, - field: 'created_at', - allowNull: false, - }, - updatedAt: { - type: Sequelize.DATE, - field: 'updated_at', - allowNull: false, - }, - deletedAt: { - type: Sequelize.DATE, - field: 'deleted_at', - }, - }); - }, - down: (queryInterface) => queryInterface.dropTable(TABLE_NAME), -}; diff --git a/apps/backend/shared/database/migrations/package.json b/apps/backend/shared/database/migrations/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/apps/backend/shared/database/migrations/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/apps/backend/shared/database/pagination.js b/apps/backend/shared/database/pagination.js deleted file mode 100644 index 5710d44..0000000 --- a/apps/backend/shared/database/pagination.js +++ /dev/null @@ -1,23 +0,0 @@ -import pick from 'lodash/pick.js'; -import { parsePath } from './helpers.js'; - -const parseOptions = ({ limit, offset, sortOrder }) => ({ - limit: parseInt(limit, 10) || 100, - offset: parseInt(offset, 10) || 0, - sortOrder: sortOrder || 'ASC', -}); - -function processPagination(Model) { - return (req, _, next) => { - const options = parseOptions(req.query); - Object.assign(req.query, options); - req.options = pick(options, ['limit', 'offset']); - const { sortBy } = req.query; - if (sortBy) { - req.options.order = [[...parsePath(sortBy, Model), options.sortOrder]]; - } - next(); - }; -} - -export { processPagination }; diff --git a/apps/backend/shared/database/seeds/20181115140901-insert-users.js b/apps/backend/shared/database/seeds/20181115140901-insert-users.js deleted file mode 100644 index 741f628..0000000 --- a/apps/backend/shared/database/seeds/20181115140901-insert-users.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -const bcrypt = require('bcrypt'); -const Promise = require('bluebird'); -const users = require('@app/seed/user.json'); - -module.exports = { - up(queryInterface) { - const now = new Date(); - const rows = users.map((user) => ({ - ...user, - created_at: now, - updated_at: now, - })); - return import('../../../config/index.js') - .then(({ auth: config }) => - Promise.map(rows, (user) => encryptPassword(user, config.saltRounds)), - ) - .then((users) => queryInterface.bulkInsert('user', users)); - }, - down(queryInterface) { - return queryInterface.bulkDelete('user'); - }, -}; - -function encryptPassword(user, saltRounds) { - return bcrypt - .hash(user.password, saltRounds) - .then((password) => (user.password = password)) - .then(() => user); -} diff --git a/apps/backend/shared/database/seeds/package.json b/apps/backend/shared/database/seeds/package.json deleted file mode 100644 index 5bbefff..0000000 --- a/apps/backend/shared/database/seeds/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "commonjs" -} diff --git a/apps/backend/shared/error/helpers.js b/apps/backend/shared/error/helpers.js deleted file mode 100644 index dc682dd..0000000 --- a/apps/backend/shared/error/helpers.js +++ /dev/null @@ -1,12 +0,0 @@ -import httpError from 'http-errors'; - -function validationError(err) { - const code = 400; - return Promise.reject(httpError(code, err.message, { validation: true })); -} - -function createError(code = 400, message = 'An error has occured') { - return Promise.reject(httpError(code, message, { custom: true })); -} - -export { createError, validationError }; diff --git a/apps/backend/shared/logger.js b/apps/backend/shared/logger.js deleted file mode 100644 index 7f2ac7f..0000000 --- a/apps/backend/shared/logger.js +++ /dev/null @@ -1,31 +0,0 @@ -import pino from 'pino'; -import pinoHttp from 'pino-http'; - -import { isProduction } from '#config'; - -export const Level = { - Fatal: 'fatal', - Error: 'error', - Warn: 'warn', - Info: 'info', - Debug: 'debug', - Trace: 'trace', - Silent: 'silent', -}; - -const prettyTransport = { - target: 'pino-pretty', - options: { colorize: true }, -}; - -const transport = isProduction ? undefined : prettyTransport; - -export const createLogger = (name, opts = {}) => - pino({ - name, - level: opts?.level || Level.Info, - transport, - }); - -export const createHttpLogger = () => - pinoHttp({ transport }); diff --git a/apps/backend/shared/mail/formatters.js b/apps/backend/shared/mail/formatters.js deleted file mode 100644 index fa043fb..0000000 --- a/apps/backend/shared/mail/formatters.js +++ /dev/null @@ -1,7 +0,0 @@ -import { htmlToText } from 'html-to-text'; - -function html() { - return (text, render) => htmlToText(render(text)); -} - -export { html }; diff --git a/apps/backend/shared/mail/index.js b/apps/backend/shared/mail/index.js deleted file mode 100644 index 6abc9c4..0000000 --- a/apps/backend/shared/mail/index.js +++ /dev/null @@ -1,95 +0,0 @@ -import { fileURLToPath, URL } from 'node:url'; -import path from 'node:path'; -import pick from 'lodash/pick.js'; -import { SMTPClient } from 'emailjs'; -import urlJoin from 'url-join'; -import { renderHtml, renderText } from './render.js'; -import { createLogger, Level } from '#logger'; -import { mail as config, origin } from '#config'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const logger = createLogger('mailer', { level: Level.DEBUG }); - -const from = `${config.sender.name} <${config.sender.address}>`; -const client = new SMTPClient(config); -// NOTE: Enable SMTP tracing if DEBUG is set. -client.smtp.debug(Number(Boolean(process.env.DEBUG))); -logger.info(getConfig(client), '๐Ÿ“ง SMTP client created'); - -const send = async (...args) => { - try { - const msg = await client.sendAsync(...args); - logger.debug('๐Ÿ“ง Email sent', msg); - return msg; - } catch (error) { - logger.error('๐Ÿ“ง Failed to send email', error); - } -}; - -const templatesDir = path.join(__dirname, './templates/'); - -const resetUrl = (token) => - urlJoin(origin, '/auth/reset-password/', token, '/'); - -export default { - send, - invite, - resetPassword, -}; - -function invite(user, token) { - const href = resetUrl(token); - const { hostname } = new URL(href); - const recipient = user.email; - const recipientName = user.firstName || user.email; - const data = { href, origin, hostname, recipientName }; - const html = renderHtml(path.join(templatesDir, 'welcome.mjml'), data); - const text = renderText(path.join(templatesDir, 'welcome.txt'), data); - logger.info( - { recipient, sender: from }, - '๐Ÿ“ง Sending invite email to:', - recipient, - ); - return send({ - from, - to: recipient, - subject: 'Invite', - text, - attachment: [{ data: html, alternative: true }], - }); -} - -function resetPassword(user, token) { - const href = resetUrl(token); - const recipient = user.email; - const recipientName = user.firstName || user.email; - const data = { href, recipientName, origin }; - const html = renderHtml(path.join(templatesDir, 'reset.mjml'), data); - const text = renderText(path.join(templatesDir, 'reset.txt'), data); - logger.info( - { recipient, sender: from }, - '๐Ÿ“ง Sending reset password email to:', - recipient, - ); - return send({ - from, - to: recipient, - subject: 'Reset password', - text, - attachment: [{ data: html, alternative: true }], - }); -} - -function getConfig(client) { - // NOTE: List public keys: - // https://github.com/eleith/emailjs/blob/7fddabe/smtp/smtp.js#L86 - return pick(client.smtp, [ - 'host', - 'port', - 'domain', - 'authentication', - 'ssl', - 'tls', - 'timeout', - ]); -} diff --git a/apps/backend/shared/mail/render.js b/apps/backend/shared/mail/render.js deleted file mode 100644 index 0442136..0000000 --- a/apps/backend/shared/mail/render.js +++ /dev/null @@ -1,38 +0,0 @@ -import * as fs from 'node:fs'; -import cheerio from 'cheerio'; -import map from 'lodash/map.js'; -import mapKeys from 'lodash/mapKeys.js'; -import mjml2html from 'mjml'; -import mustache from 'mustache'; -import { kebabCase } from 'change-case'; -import { html } from './formatters.js'; - -export { renderHtml, renderText }; - -function renderHtml(templatePath, data, style) { - const template = fs.readFileSync(templatePath, 'utf8'); - const $ = cheerio.load(template, { xmlMode: true }); - const $style = $('mj-attributes'); - $style.append(getAttributes($, style)); - const opts = { filePath: templatePath, minify: true }; - const mustacheOutput = mustache.render($.html(), data); - const output = mjml2html(mustacheOutput, opts).html; - // NOTE: Additional `mustache.render` call handles mustache syntax within mjml - // subcomponents. Subcomponents' mustache syntax is removed by `mjml2html` if - // placed outside of tag attribute or mj-text tag. - return mustache.render(output, data); -} - -function renderText(templatePath, data) { - const template = fs.readFileSync(templatePath, 'utf8'); - return mustache.render(template, { ...data, html }); -} - -function getAttributes($, style = {}) { - return map(style, (declarations, name) => - $('').attr({ - name, - ...mapKeys(declarations, (_, key) => kebabCase(key)), - }), - ); -} diff --git a/apps/backend/shared/mail/templates/components/footer.mjml b/apps/backend/shared/mail/templates/components/footer.mjml deleted file mode 100644 index 28691cc..0000000 --- a/apps/backend/shared/mail/templates/components/footer.mjml +++ /dev/null @@ -1,4 +0,0 @@ - - - If you didn't request this, please ignore this email. - diff --git a/apps/backend/shared/mail/templates/components/head.mjml b/apps/backend/shared/mail/templates/components/head.mjml deleted file mode 100644 index c564c3d..0000000 --- a/apps/backend/shared/mail/templates/components/head.mjml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - strong { - font-weight: bold; - } - - a { - color: #c2185b; - text-decoration: none; - } - - .content { - color: #222222; - font-size: 16px; - font-family: 'Helvetica Neue', helvetica, arial, sans-serif; - } - - .label { - font-size: 14px; - font-weight: 700; - } - - .avatar { - display: block; - width: 36px; - height: 36px; - color: #fff; - line-height: 36px; - font-weight: 100; - text-align: center; - border-radius: 50%; - background-color: #36474f; - } - - diff --git a/apps/backend/shared/mail/templates/components/header.mjml b/apps/backend/shared/mail/templates/components/header.mjml deleted file mode 100644 index f5a965b..0000000 --- a/apps/backend/shared/mail/templates/components/header.mjml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - App name - - - - diff --git a/apps/backend/shared/mail/templates/reset.mjml b/apps/backend/shared/mail/templates/reset.mjml deleted file mode 100644 index 3210b06..0000000 --- a/apps/backend/shared/mail/templates/reset.mjml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - Hello {{recipientName}}, - - - You have requested password reset. - - - Please reset your password by clicking the button below: - - - Reset password - - - Or copy and paste this URL into your browser: - - {{href}} - - - - - diff --git a/apps/backend/shared/mail/templates/reset.txt b/apps/backend/shared/mail/templates/reset.txt deleted file mode 100644 index 5626edb..0000000 --- a/apps/backend/shared/mail/templates/reset.txt +++ /dev/null @@ -1,15 +0,0 @@ -App name -================================================= - -Hello {{recipientName}}, - -You have requested password reset. -Please reset your password by clicking the URL below: - -{{href}} - -Or copy and paste this URL into your browser. - - -------------------------------------------------- -If you didn't request this, please ignore this email. diff --git a/apps/backend/shared/mail/templates/welcome.mjml b/apps/backend/shared/mail/templates/welcome.mjml deleted file mode 100644 index 5d59f9c..0000000 --- a/apps/backend/shared/mail/templates/welcome.mjml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - Welcome {{recipientName}}, - - - An account has been created for you on {{hostname}}. - - - Please finish your registration by clicking the button below: - - - Complete registration - - - Or copy and paste this URL into your browser: - - {{href}} - - - - - diff --git a/apps/backend/shared/mail/templates/welcome.txt b/apps/backend/shared/mail/templates/welcome.txt deleted file mode 100644 index cd9afcb..0000000 --- a/apps/backend/shared/mail/templates/welcome.txt +++ /dev/null @@ -1,15 +0,0 @@ -App name -================================================= - -Welcome {{recipientName}}, - -An account has been created for you on {{hostname}}. -Please finish your registration by clicking the URL below: - -{{href}} - -Or copy and paste this URL into your browser. - - -------------------------------------------------- -If you didn't request this, please ignore this email. diff --git a/apps/backend/shared/oAuth2Provider.js b/apps/backend/shared/oAuth2Provider.js deleted file mode 100644 index c24cc1c..0000000 --- a/apps/backend/shared/oAuth2Provider.js +++ /dev/null @@ -1,54 +0,0 @@ -import { ClientCredentials } from 'simple-oauth2'; -import request from 'axios'; -import yup from 'yup'; -import oAuthConfig from '../config/consumer.js'; - -const schema = yup.object().shape({ - clientId: yup.string().required(), - clientSecret: yup.string().required(), - tokenHost: yup.string().url().required(), - tokenPath: yup.string().required(), -}); - -function createOAuth2Provider() { - if (!oAuthConfig.isAuthConfigured) { - return { isConfigured: false }; - } - const { clientId, clientSecret, tokenHost, tokenPath } = schema.validateSync( - oAuthConfig, - { stripUnknown: true }, - ); - - const client = new ClientCredentials({ - client: { id: clientId, secret: clientSecret }, - auth: { tokenHost, tokenPath }, - }); - - let accessToken; - - async function send(url, payload) { - if (!accessToken || accessToken.expired()) { - await getAccessToken(); - } - return request - .post(url, payload, { - headers: { - Authorization: `Bearer ${accessToken.token.access_token}`, - }, - }) - .catch((error) => console.error(error.message)); - } - - function getAccessToken() { - return client - .getToken() - .then((token) => { - accessToken = token; - }) - .catch((error) => console.error('Access Token Error', error.message)); - } - - return { send, isConfigured: true }; -} - -export default createOAuth2Provider(); diff --git a/apps/backend/shared/origin.js b/apps/backend/shared/origin.js deleted file mode 100644 index bc43949..0000000 --- a/apps/backend/shared/origin.js +++ /dev/null @@ -1,19 +0,0 @@ -import { createLogger } from '#logger'; -import { hostname } from '#config'; - -const logger = createLogger(); -const isProduction = process.env.NODE_ENV === 'production'; - -export default () => { - if (hostname) return middleware; - const message = 'Origin: "HOSTNAME" is not set, using "Host" HTTP header.'; - isProduction ? logger.warn('โš ๏ธ ', message) : logger.info(message); - return middleware; -}; - -function middleware(req, _, next) { - Object.defineProperty(req, 'origin', { - get: () => `${req.protocol}://${hostname || req.get('host')}`, - }); - next(); -} diff --git a/apps/backend/shared/request/mw.js b/apps/backend/shared/request/mw.js deleted file mode 100644 index a6a5c1b..0000000 --- a/apps/backend/shared/request/mw.js +++ /dev/null @@ -1,56 +0,0 @@ -import Keyv from 'keyv'; -import rateLimit from 'express-rate-limit'; -import { - general as generalConfig, - kvStore as kvStoreConfig, -} from '#config'; - -const DEFAULT_WINDOW_MS = 1 * 60 * 1000; // every minute - -// Store must be implemented using the following interface: -// https://github.com/nfriedly/express-rate-limit/blob/master/README.md#store -class Store { - constructor() { - this.cache = new Keyv({ - ...kvStoreConfig.keyvDefaultConfig, - namespace: 'request-limiter', - }); - } - - async incr(key, cb) { - const initialState = { hits: 0 }; - const { hits, ...record } = (await this.cache.has(key)) - ? await this.cache.get(key) - : initialState; - const updatedHits = hits + 1; - await this.cache.set(key, { ...record, hits: updatedHits }); - cb(null, updatedHits); - } - - async decrement(key) { - const { hits, ...record } = (await this.cache.get(key)) || {}; - if (!hits) return; - return this.cache.set(key, { ...record, hits: hits - 1 }); - } - - resetKey(key) { - return this.cache.delete(key); - } -} - -const defaultStore = new Store(); - -function requestLimiter({ - limit = 30, - windowMs = DEFAULT_WINDOW_MS, - validate = false, - store = defaultStore, - ...opts -} = {}) { - const max = limit > 0 ? limit : 0; - const options = { limit: max, validate, windowMs, store, ...opts }; - if (!generalConfig.enableRateLimiting) options.skip = () => true; - return rateLimit(options); -} - -export { requestLimiter }; diff --git a/apps/backend/shared/sse/channels.js b/apps/backend/shared/sse/channels.js deleted file mode 100644 index 046cc41..0000000 --- a/apps/backend/shared/sse/channels.js +++ /dev/null @@ -1,59 +0,0 @@ -import { EventEmitter } from 'events'; - -const channels = new Map(); - -class Channel extends EventEmitter { - constructor(id) { - super(); - this._id = id; - this._connections = new Map(); - } - - get id() { - return this._id; - } - - add(connection) { - this._connections.set(connection.id, connection); - connection.prependOnceListener('close', () => this.remove(connection)); - return this; - } - - remove(connection) { - this._connections.delete(connection.id); - if (!this._connections.size) this.emit('close'); - return this; - } - - // eslint-disable-next-line no-unused-vars - send(_event, _data) { - this._connections.forEach((connection) => connection.send(...arguments)); - return this; - } -} - -export default { - getChannel, - addConnection, - removeConnection, -}; - -function getChannel(channelId) { - channelId = String(channelId); - return channels.get(channelId) || new Channel('\0dummy'); -} - -function addConnection(channelId, connection) { - channelId = String(channelId); - if (channels.has(channelId)) { - return channels.get(channelId).add(connection); - } - const channel = new Channel(channelId); - channel.prependOnceListener('close', () => channels.delete(channelId)); - channels.set(channelId, channel); - return channel.add(connection); -} - -function removeConnection(channelId, connection) { - return getChannel(channelId).remove(connection); -} diff --git a/apps/backend/shared/sse/index.js b/apps/backend/shared/sse/index.js deleted file mode 100644 index 8d97ef4..0000000 --- a/apps/backend/shared/sse/index.js +++ /dev/null @@ -1,125 +0,0 @@ -import { EventEmitter } from 'events'; -import { createId as cuid, isCuid } from '@paralleldrive/cuid2'; - -import channels from './channels.js'; - -const SSE_TIMEOUT_MARGIN = 0.1; -const SSE_DEFAULT_TIMEOUT = 60000; /* ms */ -const SSE_HEADERS = { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-transform', - 'Connection': 'keep-alive', - 'Transfer-Encoding': 'chunked', - // NOTE: This controls nginx proxy buffering - // https://nginx.com/resources/wiki/start/topics/examples/x-accel/#x-accel-buffering - 'X-Accel-Buffering': 'no', -}; - -const hasProp = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); - -class SSEConnection extends EventEmitter { - constructor(res) { - super(); - this._id = null; - this._res = res; - this._req = res.req; - this._lastEventId = 0; - this._heartbeat = null; - this.initialize(); - } - - static create(res) { - return new this(res); - } - - get id() { - return this._id; - } - - get socket() { - return this._res.socket; - } - - get query() { - return this._req.query; - } - - header(name) { - return this._req.header(name); - } - - get timeout() { - const connectionTimeout = parseInt(this.header('connection-timeout'), 10); - const timeout = connectionTimeout || SSE_DEFAULT_TIMEOUT; - return timeout * (1 - SSE_TIMEOUT_MARGIN); - } - - initialize() { - // Set socket properties. - this.socket.setTimeout(0); - this.socket.setNoDelay(true); - this.socket.setKeepAlive(true); - // Gracefully handle termination. - this._req.once('close', () => this.close()); - // Set event stream headers. - this._res.writeHead(200, SSE_HEADERS); - this._res.flushHeaders(); - // Ensure connection id is correctly set. - this._id = isCuid(this.query.id) ? this.query.id : cuid(); - // Setup heartbeat interval. - if (this.timeout > 0) { - this._heartbeat = setInterval(() => this.write(':ping'), this.timeout); - } - // Start stream. - return this.write(':ok'); - } - - write(payload = '') { - return this._res.write(`${payload}\n\n`); - } - - send(event, data = '') { - const id = (this._lastEventId += 1); - this.emit('data', { id, event, data }); - const json = JSON.stringify(data); - const payload = [`id: ${id}`, `event: ${event}`, `data: ${json}`].join( - '\n', - ); - this.write(payload); - if (hasProp(this.query, 'debug')) { - this.debug({ id, type: event, data }); - } - return this; - } - - debug(data = '') { - const json = JSON.stringify(data); - this.write(`data: ${json}`); - return this; - } - - close() { - if (this._heartbeat) clearInterval(this._heartbeat); - this._res.end(); - this.emit('close'); - } - - static channel(channelId) { - return channels.getChannel(channelId); - } - - join(channelId) { - return channels.addConnection(channelId, this); - } - - leave(channelId) { - return channels.removeConnection(channelId, this); - } -} - -export default SSEConnection; - -export function middleware(_req, res, next) { - res.sse = SSEConnection.create(res); - next(); -} diff --git a/apps/backend/shared/storage/index.js b/apps/backend/shared/storage/index.js deleted file mode 100644 index 78c52ea..0000000 --- a/apps/backend/shared/storage/index.js +++ /dev/null @@ -1,89 +0,0 @@ -import { fileURLToPath } from 'node:url'; -import path from 'node:path'; -import autobind from 'auto-bind'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -class Storage { - constructor(provider) { - this.provider = provider; - autobind(this); - } - - getFile(key, options = {}) { - return this.provider.getFile(key, options); - } - - createReadStream(key, options = {}) { - return this.provider.createReadStream(key, options); - } - - saveFile(key, data, options = {}) { - return this.provider.saveFile(key, data, options); - } - - createWriteStream(key, options = {}) { - return this.provider.createWriteStream(key, options); - } - - deleteFile(key, options = {}) { - return this.provider.deleteFile(key, options); - } - - deleteFiles(keys, options = {}) { - return this.provider.deleteFiles(keys, options); - } - - listFiles(options = {}) { - return this.provider.listFiles(options); - } - - fileExists(key, options = {}) { - return this.provider.fileExists(key, options); - } - - getFileUrl(key, options = {}) { - return this.provider.getFileUrl(key, options); - } - - moveFile(key, newKey, options = {}) { - return this.provider.moveFile(key, newKey, options); - } - - copyFile(key, newKey, options = {}) { - return this.provider.copyFile(key, newKey, options); - } - - static async create(config) { - const provider = await Storage.createProvider(config); - return new this(provider); - } - - static async createProvider(options) { - // Validate provider name. - const providerName = options.provider; - if (!options[providerName]) { - throw new Error('Provider should be defined in config'); - } - - // Load provider module & create provider instance. - const config = options[providerName]; - const Provider = await loadProvider(providerName); - return Provider.create(config); - } -} - -export default Storage; - -async function loadProvider(name) { - try { - const Provider = await import( - path.join(__dirname, './providers/', `${name}.js`) - ); - return Provider; - } catch (err) { - if (err.code === 'MODULE_NOT_FOUND') - throw new Error('Unsupported provider'); - throw err; - } -} diff --git a/apps/backend/shared/storage/providers/amazon.js b/apps/backend/shared/storage/providers/amazon.js deleted file mode 100644 index 3c3cded..0000000 --- a/apps/backend/shared/storage/providers/amazon.js +++ /dev/null @@ -1,199 +0,0 @@ -import { PassThrough } from 'node:stream'; -import path from 'node:path'; -import * as yup from 'yup'; -import { - CopyObjectCommand, - CreateBucketCommand, - DeleteObjectCommand, - DeleteObjectsCommand, - GetObjectCommand, - HeadBucketCommand, - HeadObjectCommand, - ListObjectsV2Command, - PutObjectCommand, - S3Client, -} from '@aws-sdk/client-s3'; -import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; -import mime from 'mime-types'; -import { Upload } from '@aws-sdk/lib-storage'; -import { validateConfig } from '../validation.js'; - -const noop = () => {}; -const isNotFound = (err) => err.Code === 'NoSuchKey'; -const DEFAULT_EXPIRATION_TIME = 3600; // seconds - -export const schema = yup.object().shape({ - endpoint: yup.string(), - region: yup.string().required(), - bucket: yup.string().required(), - key: yup.string().required(), - secret: yup.string().required(), -}); - -class Amazon { - constructor(config) { - config = validateConfig(config, schema); - - const s3Config = { - signatureVersion: 'v4', - region: config.region, - apiVersion: '2006-03-01', - maxRetries: 3, - }; - - if (config.endpoint) { - s3Config.endpoint = config.endpoint; - s3Config.forcePathStyle = true; - } - - if (config.key && config.secret) { - s3Config.credentials = { - accessKeyId: config.key, - secretAccessKey: config.secret, - }; - } - - this.bucket = config.bucket; - this.region = config.region; - this.client = new S3Client(s3Config); - this.initTestBucket(); - } - - static create(config) { - return new Amazon(config); - } - - async initTestBucket() { - const endpoint = await this.client.config.endpoint(); - if (!endpoint.hostname === 'localhost') return; - try { - await this.client.send(new HeadBucketCommand({ Bucket: this.bucket })); - } catch { - await this.client.send(new CreateBucketCommand({ Bucket: this.bucket })); - } - } - - path(...segments) { - segments = [this.bucket, ...segments]; - return path.join(...segments); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/getobjectcommand.html - getFile(key, options = {}) { - const params = Object.assign(options, { Bucket: this.bucket, Key: key }); - return this.client - .send(new GetObjectCommand(params)) - .then(({ Body: data }) => data.transformToByteArray()) - .then(Buffer.from) - .catch((err) => { - if (isNotFound(err)) return null; - return Promise.reject(err); - }); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/getobjectcommand.html - async createReadStream(key, options = {}) { - const throughStream = new PassThrough(); - const params = Object.assign(options, { - Bucket: this.bucket, - Key: key, - Body: throughStream, - ContentType: options.ContentType || mime.lookup(key), - }); - const s3Item = await this.client.send(new GetObjectCommand(params)); - s3Item.Body.pipe(throughStream); - return throughStream; - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/putobjectcommand.html - saveFile(key, data, options = {}) { - const params = Object.assign(options, { - Bucket: this.bucket, - Key: key, - Body: data, - }); - return this.client.send(new PutObjectCommand(params)); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/classes/_aws_sdk_lib_storage.Upload.html - createWriteStream(key, options = {}) { - const throughStream = new PassThrough(); - const params = Object.assign(options, { - Bucket: this.bucket, - Key: key, - Body: throughStream, - ContentType: options.ContentType || mime.lookup(key), - }); - const upload = new Upload({ client: this.client, params }); - upload.done().catch(noop); - return throughStream; - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/copyobjectcommand.html - copyFile(key, newKey, options = {}) { - const { base, ...rest } = path.parse(key); - const encodedSource = path.format({ - base: encodeURIComponent(base), - ...rest, - }); - const params = Object.assign( - options, - { Bucket: this.bucket }, - { - CopySource: this.path(`/${encodedSource}`), - Key: newKey, - }, - ); - return this.client.send(new CopyObjectCommand(params)); - } - - moveFile(key, newKey, options = {}) { - return this.copyFile(key, newKey, options).then((result) => - this.deleteFile(key).then(() => result), - ); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/deleteobjectcommand.html - deleteFile(key, options = {}) { - const params = Object.assign(options, { Bucket: this.bucket, Key: key }); - return this.client.send(new DeleteObjectCommand(params)); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/deleteobjectscommand.html - deleteFiles(keys, options = {}) { - const objects = keys.map((key) => ({ Key: key })); - if (!keys.length) return Promise.resolve(); - const params = Object.assign(options, { - Bucket: this.bucket, - Delete: { Objects: objects }, - }); - return this.client.send(new DeleteObjectsCommand(params)); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/listobjectsv2command.html - listFiles(key, options = {}) { - const params = Object.assign(options, { Bucket: this.bucket, Prefix: key }); - return this.client - .send(new ListObjectsV2Command(params)) - .then(({ Contents: files }) => files.map((file) => file.Key)); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/headobjectcommand.html - fileExists(key) { - const params = { Bucket: this.bucket, Key: key }; - return this.client.send(new HeadObjectCommand(params)).catch((err) => { - if (isNotFound(err)) return null; - return Promise.reject(err); - }); - } - - // API docs: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/getobjectcommand.html - getFileUrl(key, options = {}) { - const expires = options.expires || DEFAULT_EXPIRATION_TIME; - const params = Object.assign(options, { Bucket: this.bucket, Key: key }); - const command = new GetObjectCommand(params); - return getSignedUrl(this.client, command, { expiresIn: expires }); - } -} - -export const create = Amazon.create.bind(Amazon); diff --git a/apps/backend/shared/storage/providers/filesystem.js b/apps/backend/shared/storage/providers/filesystem.js deleted file mode 100644 index ffa51a9..0000000 --- a/apps/backend/shared/storage/providers/filesystem.js +++ /dev/null @@ -1,99 +0,0 @@ -import * as fs from 'node:fs'; -import * as fsp from 'node:fs/promises'; -import path from 'node:path'; -import expandPath from 'untildify'; -import { mkdirp } from 'mkdirp'; -import * as yup from 'yup'; -import { pathExists } from 'path-exists'; -import Promise from 'bluebird'; -import { validateConfig } from '../validation.js'; -import config from '#config'; - -const isNotFound = (err) => err.code === 'ENOENT'; -const resolvePath = (str) => path.resolve(expandPath(str)); - -export const schema = yup.object().shape({ - path: yup.string().required(), -}); - -class FilesystemStorage { - constructor(config) { - config = validateConfig(config, schema); - this.root = resolvePath(config.path); - } - - static create(config) { - return new FilesystemStorage(config); - } - - path(...segments) { - segments = [this.root, ...segments]; - return path.join(...segments); - } - - getFile(key, options = {}) { - return fsp.readFile(this.path(key), options).catch((err) => { - if (isNotFound(err)) return null; - return Promise.reject(err); - }); - } - - createReadStream(key, options = {}) { - return fs.createReadStream(this.path(key), options); - } - - saveFile(key, data, options = {}) { - const filePath = this.path(key); - return mkdirp(path.dirname(filePath)).then(() => - fsp.writeFile(filePath, data, options), - ); - } - - createWriteStream(key, options = {}) { - const filepath = this.path(key); - const dirname = path.dirname(filepath); - // TODO: Replace with async mkdir - fs.mkdirSync(dirname, { recursive: true }); - return fs.createWriteStream(filepath, options); - } - - copyFile(key, newKey) { - const src = this.path(key); - const dest = this.path(newKey); - return mkdirp(path.dirname(dest)).then(() => fsp.copyFile(src, dest)); - } - - moveFile(key, newKey) { - return this.copyFile(key, newKey).then((file) => - this.deleteFile(key).then(() => file), - ); - } - - deleteFile(key) { - return fsp.unlink(this.path(key)); - } - - deleteFiles(keys) { - return Promise.map(keys, (key) => this.deleteFile(key)); - } - - listFiles(key, options = {}) { - return fsp - .readdir(this.path(key), options) - .map((fileName) => `${key}/${fileName}`) - .catch((err) => { - if (isNotFound(err)) return null; - return Promise.reject(err); - }); - } - - fileExists(key) { - return pathExists(this.path(key)); - } - - getFileUrl(key) { - return Promise.resolve(`${config.origin}/${key}`); - } -} - -export const create = FilesystemStorage.create.bind(FilesystemStorage); diff --git a/apps/backend/shared/storage/storage.controller.js b/apps/backend/shared/storage/storage.controller.js deleted file mode 100644 index bd54fe7..0000000 --- a/apps/backend/shared/storage/storage.controller.js +++ /dev/null @@ -1,29 +0,0 @@ -import path from 'node:path'; -import fecha from 'fecha'; -import StorageService from './storage.service.js'; - -const { getFileUrl } = Storage; - -function getUrl(req, res) { - const { - query: { key }, - } = req; - return getFileUrl(key).then((url) => res.json({ url })); -} - -async function upload({ file, body, user }, res) { - const { name } = path.parse(file.originalname); - if (body.unpack) { - const timestamp = fecha.format(new Date(), 'YYYY-MM-DDTHH:mm:ss'); - const root = `${timestamp}__${user.id}__${name}`; - const assets = await StorageService.uploadArchiveContent(file, root); - return res.json({ root, assets }); - } - const asset = await StorageService.uploadFile(file, name); - return res.json(asset); -} - -export default { - getUrl, - upload, -}; diff --git a/apps/backend/shared/storage/storage.router.js b/apps/backend/shared/storage/storage.router.js deleted file mode 100644 index db52513..0000000 --- a/apps/backend/shared/storage/storage.router.js +++ /dev/null @@ -1,13 +0,0 @@ -import express from 'express'; -import multer from 'multer'; -import ctrl from './storage.controller.js'; - -const router = express.Router(); -const upload = multer({ storage: multer.memoryStorage() }); - -router.get('/', ctrl.getUrl).post('/', upload.single('file'), ctrl.upload); - -export default { - path: '/assets', - router, -}; diff --git a/apps/backend/shared/storage/storage.service.js b/apps/backend/shared/storage/storage.service.js deleted file mode 100644 index 14732f8..0000000 --- a/apps/backend/shared/storage/storage.service.js +++ /dev/null @@ -1,58 +0,0 @@ -import path from 'node:path'; -import fromPairs from 'lodash/fromPairs.js'; -import JSZip from 'jszip'; -import mime from 'mime-types'; -import pickBy from 'lodash/pickBy.js'; -import request from 'axios'; -import { v4 as uuidv4 } from 'uuid'; - -import Storage from '../../repository/storage.js'; -import { readFile, sha256 } from './util.js'; -import { storage as config } from '#config'; - -const { getFileUrl, getPath, saveFile } = Storage; -const getStorageUrl = (key) => `${config.protocol}${key}`; - -class StorageService { - // Prefix key with custom protocol. e.g. storage://sample_key.ext - getStorageUrl = (key) => `${config.protocol}${key}`; - - async uploadFile(file, name) { - const buffer = await readFile(file); - const hash = sha256(file.originalname, buffer); - const extension = path.extname(file.originalname); - const fileName = `${hash}___${name}${extension}`; - const key = path.join(getPath(), fileName); - await saveFile(key, buffer, { ContentType: file.mimetype }); - const publicUrl = await getFileUrl(key); - return { key, publicUrl, url: getStorageUrl(key) }; - } - - async uploadArchiveContent(archive, name) { - const buffer = await readFile(archive); - const content = await JSZip.loadAsync(buffer); - const files = pickBy(content.files, (it) => !it.dir); - const keys = await Promise.all( - Object.keys(files).map(async (src) => { - const key = path.join(getPath(), name, src); - const file = await content.file(src).async('uint8array'); - const mimeType = mime.lookup(src); - await saveFile(key, Buffer.from(file), { ContentType: mimeType }); - return [key, getStorageUrl(key)]; - }), - ); - return fromPairs(keys); - } - - async downloadToStorage(url) { - const res = await request.get(url, { responseType: 'arraybuffer' }); - const filename = path.join( - getPath(), - `${uuidv4()}__${url.pathname.split('/').pop()}`, - ); - await Storage.saveFile(filename, res.data); - return getStorageUrl(filename); - } -} - -export default new StorageService(); diff --git a/apps/backend/shared/storage/util.js b/apps/backend/shared/storage/util.js deleted file mode 100644 index 16e3b95..0000000 --- a/apps/backend/shared/storage/util.js +++ /dev/null @@ -1,15 +0,0 @@ -import * as fsp from 'node:fs/promises'; -import crypto from 'node:crypto'; - -function sha256(...args) { - const hash = crypto.createHash('sha256'); - args.forEach((arg) => hash.update(arg)); - return hash.digest('hex'); -} - -function readFile(file) { - if (file.buffer) return Promise.resolve(file.buffer); - return fsp.readFile(file.path); -} - -export { sha256, readFile }; diff --git a/apps/backend/shared/storage/validation.js b/apps/backend/shared/storage/validation.js deleted file mode 100644 index 683d988..0000000 --- a/apps/backend/shared/storage/validation.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as yup from 'yup'; - -const { ValidationError } = yup; - -yup.addMethod(yup.string, 'pkcs1', function () { - function isValid(value) { - if (!value) return false; - const isValidStart = value.startsWith('-----BEGIN RSA PRIVATE KEY-----'); - const isValidEnd = value.endsWith('-----END RSA PRIVATE KEY-----'); - return isValidStart && isValidEnd; - } - return this.test('format', 'Invalid private key format', isValid); -}); - -export { validateConfig }; - -function validateConfig(config, schema) { - try { - return schema.validateSync(config, { stripUnknown: true }); - } catch (error) { - if (!ValidationError.isError(error)) throw error; - const err = new Error('Unsupported config structure'); - err.cause = error; - throw err; - } -} diff --git a/apps/backend/shared/util/Deferred.js b/apps/backend/shared/util/Deferred.js deleted file mode 100644 index 5aa0ad1..0000000 --- a/apps/backend/shared/util/Deferred.js +++ /dev/null @@ -1,9 +0,0 @@ -export default function Deferred() { - this.promise = new Promise((resolve, reject) => { - this.resolve = resolve; - this.reject = reject; - }); - this.callback = (err, ...args) => { - return err ? this.reject(err) : this.resolve(...args); - }; -} diff --git a/apps/backend/shared/util/processListQuery.js b/apps/backend/shared/util/processListQuery.js deleted file mode 100644 index 74d0b1d..0000000 --- a/apps/backend/shared/util/processListQuery.js +++ /dev/null @@ -1,38 +0,0 @@ -import assign from 'lodash/assign.js'; -import defaultsDeep from 'lodash/defaultsDeep.js'; -import { Op } from 'sequelize'; -import pick from 'lodash/pick.js'; - -const filter = { - where: {}, - offset: 0, - limit: null, - order: [['id', 'ASC']], - paranoid: true, -}; - -export default function (defaults) { - return function (req, _res, next) { - const order = [[req.query.sortBy, req.query.sortOrder]]; - const query = assign(pick(req.query, ['offset', 'limit', 'paranoid']), { - order, - }); - const options = defaultsDeep({}, query, defaults, filter); - - if (query.integration) { - options.paranoid = false; - } - - if (query.syncedAt) { - const condition = { $gte: query.syncedAt }; - options.where[Op.or] = [ - { updatedAt: condition }, - { deletedAt: condition }, - ]; - } - - req.opts = options; - - next(); - }; -} diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts new file mode 100644 index 0000000..f5036c5 --- /dev/null +++ b/apps/backend/src/app.module.ts @@ -0,0 +1,80 @@ +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; +import { APP_GUARD } from '@nestjs/core'; +import { AuthModule } from './modules/auth/auth.module'; +import { CommonModule } from './common/common.module'; +import { HealthModule } from './modules/health/health.module'; +import { LoggerModule } from 'nestjs-pino'; +import { MailModule } from './modules/mail/mail.module'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { Module } from '@nestjs/common'; +import { ServeStaticModule } from '@nestjs/serve-static'; +import { SeedModule } from './modules/seed/seed.module'; +import { UserModule } from './modules/user/user.module'; +import { SentryModule } from '@sentry/nestjs/setup'; + +import authConfig from './config/auth.config'; +import dbConfig from './config/db.config'; +import generalConfig from './config/general.config'; +import { join } from 'path'; +import mailConfig from './config/mail.config'; +import mikroOrmConfig from './config/mikro-orm.config'; +import pinoConfig from './config/lib/pino.config'; +import { validationSchema } from './config/validation'; + +const isProduction = process.env.NODE_ENV === 'production'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + envFilePath: '../../.env', + load: [authConfig, dbConfig, generalConfig, mailConfig, mikroOrmConfig], + validationSchema, + isGlobal: true, + cache: true, + expandVariables: true, + }), + LoggerModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: async (config: ConfigService) => { + const isProd = config.get('isProduction', { infer: true }); + const level = config.get('logLevel', { infer: true }); + return pinoConfig(level, isProd); + }, + }), + ServeStaticModule.forRoot({ + rootPath: join(__dirname, '../../..', 'frontend/.output/public'), + exclude: ['/api*'], + serveRoot: '/', + }), + SentryModule.forRoot(), + MikroOrmModule.forRootAsync({ + inject: [ConfigService], + useFactory: async (configService: ConfigService) => { + const mikroConfig = configService.get('mikroORM'); + const database = configService.get('database'); + const saltRounds = configService.get('auth.saltRounds'); + return { + ...mikroConfig, + ...database, + saltRounds, + }; + }, + }), + ThrottlerModule.forRoot([{ ttl: 60000, limit: 100 }]), + CommonModule, + AuthModule, + HealthModule, + MailModule, + UserModule, + ...(!isProduction ? [SeedModule] : []), + ], + providers: [ + { + provide: APP_GUARD, + useClass: ThrottlerGuard, + }, + ], +}) +export class AppModule {} diff --git a/apps/backend/src/common/common.module.ts b/apps/backend/src/common/common.module.ts new file mode 100644 index 0000000..41a4ea6 --- /dev/null +++ b/apps/backend/src/common/common.module.ts @@ -0,0 +1,40 @@ +import { Module, Global } from '@nestjs/common'; +import { AllExceptionsFilter } from './filters/all-exceptions.filter'; +import { HttpExceptionFilter } from './filters/http-exception.filter'; +import { LoggingInterceptor } from './interceptors/logging.interceptor'; +import { ResponseInterceptor } from './interceptors/response.interceptor'; +import { ThrottlerExceptionFilter } from './filters/throttler-exception.filter'; +import { ValidationExceptionFilter } from './filters/validation-exception.filter'; + +// Re-export constants and interfaces for easy access +export type { ErrorType } from './constants/error-codes'; +export { ErrorTypes } from './constants/error-codes'; +export type { + ApiResponse, + ErrorResponse, + StructuredResponse, + SuccessResponse, +} from './interfaces/response.interface'; + +@Global() +@Module({ + providers: [ + // Note: Some of these are registered globally in main.ts + // Keeping them here for module completeness + AllExceptionsFilter, + HttpExceptionFilter, + LoggingInterceptor, + ResponseInterceptor, + ThrottlerExceptionFilter, + ValidationExceptionFilter, + ], + exports: [ + AllExceptionsFilter, + HttpExceptionFilter, + LoggingInterceptor, + ResponseInterceptor, + ThrottlerExceptionFilter, + ValidationExceptionFilter, + ], +}) +export class CommonModule {} diff --git a/apps/backend/src/common/constants/error-codes.ts b/apps/backend/src/common/constants/error-codes.ts new file mode 100644 index 0000000..82f60ef --- /dev/null +++ b/apps/backend/src/common/constants/error-codes.ts @@ -0,0 +1,35 @@ +import { HttpStatus } from '@nestjs/common'; + +// Simple error types for categorizing errors +export const ErrorTypes = { + VALIDATION: 'Validation', + AUTHENTICATION: 'Authentication', + AUTHORIZATION: 'Authorization', + RATE_LIMIT: 'RateLimit', + INTERNAL: 'Internal', + HTTP: 'Http', +} as const; + +export type ErrorType = (typeof ErrorTypes)[keyof typeof ErrorTypes]; + +// Properly classify error types based on HTTP status +export const getErrorType = (status: number): string => { + if ([HttpStatus.UNAUTHORIZED].includes(status)) { + return ErrorTypes.AUTHENTICATION; + } + if ([HttpStatus.FORBIDDEN].includes(status)) { + return ErrorTypes.AUTHORIZATION; + } + if ( + [HttpStatus.BAD_REQUEST, HttpStatus.UNPROCESSABLE_ENTITY].includes(status) + ) { + return ErrorTypes.VALIDATION; + } + if ([HttpStatus.TOO_MANY_REQUESTS].includes(status)) { + return ErrorTypes.RATE_LIMIT; + } + if (status >= 500) { + return ErrorTypes.INTERNAL; + } + return ErrorTypes.HTTP; +}; diff --git a/apps/backend/src/common/filters/all-exceptions.filter.ts b/apps/backend/src/common/filters/all-exceptions.filter.ts new file mode 100644 index 0000000..56e88cf --- /dev/null +++ b/apps/backend/src/common/filters/all-exceptions.filter.ts @@ -0,0 +1,61 @@ +import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; +import { Catch, HttpStatus } from '@nestjs/common'; +import type { Request, Response } from 'express'; +import type { ErrorResponse } from '../interfaces/response.interface'; +import { ErrorTypes } from '../constants/error-codes'; +import { PinoLogger } from 'nestjs-pino'; +import { SentryExceptionCaptured } from '@sentry/nestjs'; +import { formatDevelopmentDetails } from '../utils/format-error-details.util'; +import { sanitizeRequestBody } from '../utils/sanitize-request-body.util'; +import { sanitizeUser } from '../utils/sanitize-user.util'; + +@Catch() +export class AllExceptionsFilter implements ExceptionFilter { + constructor(private readonly logger: PinoLogger) { + this.logger.setContext(AllExceptionsFilter.name); + } + + @SentryExceptionCaptured() + catch(exception: unknown, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + const isProduction = process.env.NODE_ENV === 'production'; + const isDevelopment = process.env.NODE_ENV === 'development'; + const isErrorInstance = exception instanceof Error; + // Handle non-HTTP exceptions (database errors, network errors, etc.) + // Note: HttpExceptions should already be handled by more specific filters + // Don't expose internal error details in production + // Sanitize user data for logging + const sanitizedUser = sanitizeUser(request.user); + const sanitizedBody = sanitizeRequestBody(request.body); + const status = HttpStatus.INTERNAL_SERVER_ERROR; + const message = + isErrorInstance && !isProduction + ? exception.message + : 'Internal server error'; + const desc = `${request.method} ${request.url} - ${status} - ${message}`; + this.logger.error(`Unhandled Exception: ${desc}`, { + user: sanitizedUser, + body: sanitizedBody, + stack: isErrorInstance ? exception.stack : undefined, + error: isErrorInstance ? exception.message : String(exception), + }); + const details = + isDevelopment && isErrorInstance + ? formatDevelopmentDetails(exception) + : undefined; + const errorResponse: ErrorResponse = { + success: false, + error: { type: ErrorTypes.INTERNAL, message, details }, + meta: { + path: request.url, + method: request.method, + statusCode: status, + timestamp: new Date().toISOString(), + duration: 0, // Not available in exception context + }, + }; + return response.status(status).json(errorResponse); + } +} diff --git a/apps/backend/src/common/filters/http-exception.filter.ts b/apps/backend/src/common/filters/http-exception.filter.ts new file mode 100644 index 0000000..b8c9759 --- /dev/null +++ b/apps/backend/src/common/filters/http-exception.filter.ts @@ -0,0 +1,61 @@ +import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; +import { Catch, HttpException } from '@nestjs/common'; +import type { Request, Response } from 'express'; +import type { ErrorResponse } from '../interfaces/response.interface'; +import { PinoLogger } from 'nestjs-pino'; +import { formatErrorDetails } from '../utils/format-error-details.util'; +import { getErrorType } from '../constants/error-codes'; +import { sanitizeRequestBody } from '../utils/sanitize-request-body.util'; +import { sanitizeUser } from '../utils/sanitize-user.util'; + +@Catch(HttpException) +export class HttpExceptionFilter implements ExceptionFilter { + constructor(private readonly logger: PinoLogger) { + this.logger.setContext(HttpExceptionFilter.name); + } + + catch(exception: HttpException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const request = ctx.getRequest(); + const response = ctx.getResponse(); + const statusCode = exception.getStatus(); + const errorType = getErrorType(statusCode); + const exceptionResponse = exception.getResponse(); + const exceptionInfo = + typeof exceptionResponse === 'string' + ? { message: exceptionResponse } + : (exceptionResponse as any); + // Sanitize user data for logging + const sanitizedUser = sanitizeUser(request.user); + const sanitizedBody = sanitizeRequestBody(request.body); + const message = exceptionInfo.message || 'HTTP Exception'; + this.logger.error( + `HTTP Exception: ${request.method} ${request.url} ${statusCode}`, + { + statusCode, + errorType, + user: sanitizedUser, + body: sanitizedBody, + message, + }, + ); + const errorResponse: ErrorResponse = { + success: false, + error: { + type: errorType, + message, + details: exceptionInfo.error + ? formatErrorDetails(exceptionInfo) + : undefined, + }, + meta: { + timestamp: new Date().toISOString(), + path: request.url, + method: request.method, + duration: 0, // Not available in exception context + statusCode, + }, + }; + return response.status(statusCode).json(errorResponse); + } +} diff --git a/apps/backend/src/common/filters/throttler-exception.filter.ts b/apps/backend/src/common/filters/throttler-exception.filter.ts new file mode 100644 index 0000000..eaef637 --- /dev/null +++ b/apps/backend/src/common/filters/throttler-exception.filter.ts @@ -0,0 +1,76 @@ +import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; +import type { Request, Response } from 'express'; +import { Catch } from '@nestjs/common'; +import { ErrorTypes } from '../constants/error-codes'; +import type { ErrorResponse } from '../interfaces/response.interface'; +import { PinoLogger } from 'nestjs-pino'; +import { ThrottlerException } from '@nestjs/throttler'; +import { sanitizeUser } from '../utils/sanitize-user.util'; + +@Catch(ThrottlerException) +export class ThrottlerExceptionFilter implements ExceptionFilter { + constructor(private readonly logger: PinoLogger) { + this.logger.setContext(ThrottlerExceptionFilter.name); + } + + catch(_exception: ThrottlerException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const request = ctx.getRequest(); + const response = ctx.getResponse(); + const sanitizedUser = sanitizeUser(request.user); + const userAgent = request.get('User-Agent'); + const endpoint = `${request.method} ${request.url}`; + // Calculate retry-after based on TTL (60 seconds from config) + const retryAfter = 60; + // Log rate limit violation with security context + this.logger.warn('Rate limit exceeded', { + user: sanitizedUser, + ip: request.ip, + userAgent, + endpoint, + retryAfter, + // Security flags + suspiciousActivity: this.detectSuspiciousActivity(request), + highFrequency: true, // By definition, if throttled + }); + // Set standard rate limit headers + response.set('Retry-After', retryAfter.toString()); + response.set('X-RateLimit-Limit', '100'); + response.set('X-RateLimit-Remaining', '0'); + response.set( + 'X-RateLimit-Reset', + Math.ceil(Date.now() / 1000 + retryAfter).toString(), + ); + const errorResponse: ErrorResponse = { + success: false, + error: { + type: ErrorTypes.RATE_LIMIT, + message: 'Too many requests, please try again later', + details: [ + { + retryAfter, + limitInfo: { limit: 100, window: '60 seconds' }, + suspicious: this.detectSuspiciousActivity(request), + }, + ], + }, + meta: { + statusCode: 429, + path: request.url, + method: request.method, + timestamp: new Date().toISOString(), + duration: 0, // Not available in exception context + }, + }; + return response.status(429).json(errorResponse); + } + + private detectSuspiciousActivity(request: Request): boolean { + const userAgent = request.get('User-Agent') || ''; + // Flag potential automated/bot activity + const botPatterns = /bot|crawler|spider|scraper|curl|wget|postman/i; + const missingUserAgent = !userAgent; + const shortUserAgent = userAgent.length < 10; + return botPatterns.test(userAgent) || missingUserAgent || shortUserAgent; + } +} diff --git a/apps/backend/src/common/filters/validation-exception.filter.ts b/apps/backend/src/common/filters/validation-exception.filter.ts new file mode 100644 index 0000000..b756e5d --- /dev/null +++ b/apps/backend/src/common/filters/validation-exception.filter.ts @@ -0,0 +1,54 @@ +import type { ArgumentsHost, ExceptionFilter } from '@nestjs/common'; +import { BadRequestException, Catch } from '@nestjs/common'; +import { ErrorTypes } from '../constants/error-codes'; +import type { ErrorResponse } from '../interfaces/response.interface'; +import type { Request, Response } from 'express'; +import { PinoLogger } from 'nestjs-pino'; +import { sanitizeUser } from '../utils/sanitize-user.util'; +import { sanitizeRequestBody } from '../utils/sanitize-request-body.util'; +import { formatValidationDetails } from '../utils/format-error-details.util'; + +@Catch(BadRequestException) +export class ValidationExceptionFilter implements ExceptionFilter { + constructor(private readonly logger: PinoLogger) { + this.logger.setContext(ValidationExceptionFilter.name); + } + + catch(exception: BadRequestException, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const request = ctx.getRequest(); + const response = ctx.getResponse(); + const statusCode = exception.getStatus(); + let errors = [] as any[]; + const exceptionResponse = exception.getResponse() as any; + if (exceptionResponse.message && Array.isArray(exceptionResponse.message)) { + errors = exceptionResponse.message; + } else if (typeof exceptionResponse.message === 'string') { + errors = [exceptionResponse?.message]; + } + // Sanitize user data for logging + const sanitizedUser = sanitizeUser(request.user); + const sanitizedBody = sanitizeRequestBody(request.body); + this.logger.warn(`Validation Error: ${request.method} ${request.url}`, { + user: sanitizedUser, + body: sanitizedBody, + validationErrors: errors, + }); + const errorResponse: ErrorResponse = { + success: false, + error: { + type: ErrorTypes.VALIDATION, + message: 'Request validation failed', + details: formatValidationDetails(errors), + }, + meta: { + statusCode, + path: request.url, + method: request.method, + timestamp: new Date().toISOString(), + duration: 0, // Not available in exception context + }, + }; + return response.status(statusCode).json(errorResponse); + } +} diff --git a/apps/backend/src/common/interceptors/logging.interceptor.ts b/apps/backend/src/common/interceptors/logging.interceptor.ts new file mode 100644 index 0000000..f4773d8 --- /dev/null +++ b/apps/backend/src/common/interceptors/logging.interceptor.ts @@ -0,0 +1,72 @@ +import type { + CallHandler, + NestInterceptor, + ExecutionContext, +} from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; +import type { Observable } from 'rxjs'; +import { PinoLogger } from 'nestjs-pino'; +import { sanitizeUser } from '../utils/sanitize-user.util'; +import { sanitizeRequestBody } from '../utils/sanitize-request-body.util'; +import { tap } from 'rxjs/operators'; + +// The LoggingInterceptor essentially provides comprehensive request/response +// audit logging for every API call +// +// Execution Order: +// 1. ๐ŸŸข LoggingInterceptor.intercept() - "Request started" +// 2. ๐Ÿ›ก๏ธ ThrottlerGuard - Rate limiting check +// 3. ๐Ÿ” JwtAuthGuard - Authentication +// 4. ๐ŸŽฏ Controller method execution +// 5. ๐Ÿ“Š ResponseInterceptor - Format response +// 6. ๐ŸŸข LoggingInterceptor.tap() - "Request completed" +@Injectable() +export class LoggingInterceptor implements NestInterceptor { + constructor(private readonly logger: PinoLogger) { + this.logger.setContext(LoggingInterceptor.name); + } + + intercept(context: ExecutionContext, next: CallHandler): Observable { + const request = context.switchToHttp().getRequest(); + const { method, url, body, user, ip } = request; + const startTime = Date.now(); + // Sanitize sensitive data before logging + const sanitizedBody = sanitizeRequestBody(body); + const sanitizedUser = sanitizeUser(user); + // Structured logging for incoming request + this.logger.info('Request started', { + method, + url, + ip, + userAgent: request.get('User-Agent'), + user: sanitizedUser, + body: Object.keys(body || {}).length ? sanitizedBody : undefined, + }); + return next.handle().pipe( + tap({ + next: (_data) => { + const response = context.switchToHttp().getResponse(); + const responseTime = Date.now() - startTime; + this.logger.info('Request completed', { + method, + url, + statusCode: response.statusCode, + responseTime, + user: sanitizedUser, + }); + }, + error: (error) => { + const responseTime = Date.now() - startTime; + this.logger.error('Request failed', { + method, + url, + statusCode: error.status || 500, + responseTime, + error: error.message, + user: sanitizedUser, + }); + }, + }), + ); + } +} diff --git a/apps/backend/src/common/interceptors/response.interceptor.ts b/apps/backend/src/common/interceptors/response.interceptor.ts new file mode 100644 index 0000000..f719072 --- /dev/null +++ b/apps/backend/src/common/interceptors/response.interceptor.ts @@ -0,0 +1,64 @@ +import type { + NestInterceptor, + ExecutionContext, + CallHandler, +} from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; +import type { Observable } from 'rxjs'; +import type { SuccessResponse } from '../interfaces/response.interface'; +import { map } from 'rxjs/operators'; + +// The ResponseInterceptor acts as a universal response formatter, +// ensuring every API response follows the same contract while preserving +// special cases like pagination and providing useful metadata like performance +// timing. +@Injectable() +export class ResponseInterceptor implements NestInterceptor> { + intercept( + context: ExecutionContext, + next: CallHandler, + ): Observable> { + const startTime = Date.now(); + const request = context.switchToHttp().getRequest(); + return next.handle().pipe( + map((data) => { + const duration = Date.now() - startTime; + // If data is already formatted (e.g., from pagination) + if ( + data && + typeof data === 'object' && + 'data' in data && + 'total' in data + ) { + return { + success: true, + data: data.data, + meta: { + timestamp: new Date().toISOString(), + path: request.url, + method: request.method, + duration, + pagination: { + total: data.total, + page: data.page || 1, + limit: data.limit || 10, + has_next: data.page * data.limit < data.total, + }, + }, + } as SuccessResponse; + } + // Standard response format + return { + success: true, + data, + meta: { + timestamp: new Date().toISOString(), + path: request.url, + method: request.method, + duration, + }, + } as SuccessResponse; + }), + ); + } +} diff --git a/apps/backend/src/common/interfaces/response.interface.ts b/apps/backend/src/common/interfaces/response.interface.ts new file mode 100644 index 0000000..4a7c6e4 --- /dev/null +++ b/apps/backend/src/common/interfaces/response.interface.ts @@ -0,0 +1,41 @@ +export interface StructuredResponse { + success: boolean; + data?: T; + error?: { + type: string; + message: string; + details?: any[]; + }; + meta: { + statusCode?: number; + path: string; + method: string; + timestamp: string; + duration: number; + pagination?: { + total: number; + page: number; + limit: number; + has_next: boolean; + }; + }; +} + +// Type helpers for better dev experience +export type SuccessResponse = StructuredResponse & { + success: true; + data: T; + error?: never; +}; + +export type ErrorResponse = StructuredResponse & { + success: false; + data?: never; + error: { + type: string; + message: string; + details?: any[]; + }; +}; + +export type ApiResponse = SuccessResponse | ErrorResponse; diff --git a/apps/backend/src/common/utils/format-error-details.util.ts b/apps/backend/src/common/utils/format-error-details.util.ts new file mode 100644 index 0000000..dadb769 --- /dev/null +++ b/apps/backend/src/common/utils/format-error-details.util.ts @@ -0,0 +1,51 @@ +/** + * Standardizes error detail formatting across all exception filters + */ +export function formatErrorDetails(details: any): any[] | undefined { + if (!details) { + return undefined; + } + // If already an array, return as-is + if (Array.isArray(details)) { + return details; + } + // If it's an object, wrap in array + if (typeof details === 'object') { + return [details]; + } + // If it's a string, wrap in array + if (typeof details === 'string') { + return [details]; + } + // Fallback + return [details]; +} + +/** + * Creates standardized validation error details + */ +export function formatValidationDetails(validationErrors: any[]): any[] { + if (!validationErrors || !Array.isArray(validationErrors)) { + return []; + } + return validationErrors.map((error) => { + if (typeof error === 'string') { + return { message: error }; + } + if (typeof error === 'object' && error.message) { + return { message: error.message, field: error.property }; + } + return { message: String(error) }; + }); +} + +/** + * Creates standardized development error details + */ +export function formatDevelopmentDetails(exception: Error): any[] { + return [{ + stack: exception.stack, + name: exception.name, + message: exception.message, + }]; +} diff --git a/apps/backend/src/common/utils/sanitize-request-body.util.ts b/apps/backend/src/common/utils/sanitize-request-body.util.ts new file mode 100644 index 0000000..294b3a7 --- /dev/null +++ b/apps/backend/src/common/utils/sanitize-request-body.util.ts @@ -0,0 +1,101 @@ +/** + * Sanitizes request body for logging purposes by masking sensitive fields + * at any depth. Handles nested objects, arrays, and circular references safely. + */ +export function sanitizeRequestBody(body: any, visited = new WeakSet()): any { + // Handle primitives and null/undefined + if (body === null || body === undefined || typeof body !== 'object') { + return body; + } + + // Prevent infinite recursion with circular references + if (visited.has(body)) { + return '[Circular Reference]'; + } + visited.add(body); + + // Handle Arrays + if (Array.isArray(body)) { + return body.map((item) => sanitizeRequestBody(item, visited)); + } + + // Handle Date objects + if (body instanceof Date) { + return body.toISOString(); + } + + // Handle other special objects (RegExp, etc.) + if (body.constructor !== Object) { + return '[Object: ' + body.constructor.name + ']'; + } + + // Handle plain objects + const sanitized: any = {}; + + // All potentially sensitive field names (including common variations) + const sensitiveFields = new Set([ + 'password', + 'currentPassword', + 'newPassword', + 'oldPassword', + 'confirmPassword', + 'passwordConfirmation', + 'refreshToken', + 'jwt', + 'token', + 'accessToken', + 'idToken', + 'authToken', + 'bearerToken', + 'sessionToken', + 'csrfToken', + 'secret', + 'clientSecret', + 'apiSecret', + 'privateKey', + 'publicKey', + 'apiKey', + 'sessionId', + 'cookie', + 'cookies', + 'authorization', + 'auth', + 'credentials', + 'credit_card', + 'creditCard', + 'card_number', + 'cardNumber', + 'cvv', + 'cvc', + 'pin', + 'ssn', + 'oib', + 'social_security', + 'socialSecurity', + 'passport', + 'license', + 'driverLicense', + ]); + + for (const key in body) { + if (!Object.prototype.hasOwnProperty.call(body, key)) continue; + const lowerKey = key.toLowerCase(); + // Check if field name contains sensitive keywords + const isSensitive = + sensitiveFields.has(lowerKey) || + lowerKey.includes('password') || + lowerKey.includes('token') || + lowerKey.includes('secret') || + lowerKey.includes('key') || + lowerKey.includes('auth') || + lowerKey.includes('credential'); + if (isSensitive) { + sanitized[key] = '[MASKED]'; + } else { + // Recursively sanitize nested objects/arrays + sanitized[key] = sanitizeRequestBody(body[key], visited); + } + } + + return sanitized; +} diff --git a/apps/backend/src/common/utils/sanitize-user.util.ts b/apps/backend/src/common/utils/sanitize-user.util.ts new file mode 100644 index 0000000..c86bb74 --- /dev/null +++ b/apps/backend/src/common/utils/sanitize-user.util.ts @@ -0,0 +1,13 @@ +/** + * Sanitizes user data for logging purposes by only keeping the id field. + * This approach is more secure than trying to mask arbitrary sensitive fields. + */ +export function sanitizeUser(user: any): { id?: number | string } | null { + if (!user || typeof user !== 'object') { + return null; + } + + return { + id: user.id || user.sub || null, + }; +} diff --git a/apps/backend/src/common/validators/data-url.validator.ts b/apps/backend/src/common/validators/data-url.validator.ts new file mode 100644 index 0000000..ee06708 --- /dev/null +++ b/apps/backend/src/common/validators/data-url.validator.ts @@ -0,0 +1,55 @@ +import { + ValidationArguments, + ValidationOptions, + registerDecorator, +} from 'class-validator'; + +const dataUrlValidator = (value: any, _args: ValidationArguments) => { + if (typeof value !== 'string') return false; + + // Allow empty string to remove current image + if (value === '') return true; + + // Check if it's a valid data URL format + const dataUrlPattern = + /^data:([a-zA-Z0-9][a-zA-Z0-9/+]*);base64,([A-Za-z0-9+/=]+)$/; + if (!dataUrlPattern.test(value)) return false; + + // Extract the MIME type + const match = value.match(/^data:([^;]+);base64,/); + if (!match) return false; + + const mimeType = match[1]; + + // Only allow image MIME types + const allowedImageTypes = [ + 'image/jpeg', + 'image/jpg', + 'image/png', + 'image/gif', + 'image/webp', + 'image/bmp', + 'image/svg+xml', + ]; + return allowedImageTypes.includes(mimeType.toLowerCase()); +}; + +// Custom validator for data URLs (specifically image data URLs) +export function IsDataUrl(validationOptions?: ValidationOptions) { + return function (object: object, propertyName: string) { + registerDecorator({ + name: 'isDataUrl', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate: dataUrlValidator, + defaultMessage(args: ValidationArguments) { + const msg = + 'must be a valid image data URL or empty string to remove image'; + return `${args.property} ${msg}`; + }, + }, + }); + }; +} diff --git a/apps/backend/src/common/validators/no-xss.validator.ts b/apps/backend/src/common/validators/no-xss.validator.ts new file mode 100644 index 0000000..f143bfe --- /dev/null +++ b/apps/backend/src/common/validators/no-xss.validator.ts @@ -0,0 +1,71 @@ +import { + ValidationArguments, + ValidationOptions, + registerDecorator, +} from 'class-validator'; + +const xssValidator = (value: any, _args: ValidationArguments) => { + if (typeof value !== 'string') return true; + // Check for common XSS patterns + const xssPatterns = [ + /)<[^<]*)*<\/script>/gi, + /)<[^<]*)*<\/iframe>/gi, + /javascript:/gi, + /on\w+\s*=/gi, // Event handlers like onclick=, onerror= + /]+src[\s]*=[\s]*["']javascript:/gi, + /)<[^<]*)*<\/object>/gi, + /)<[^<]*)*<\/embed>/gi, + ]; + for (const pattern of xssPatterns) { + if (pattern.test(value)) return false; + } + // Check for HTML tags (optional - stricter validation) + const htmlPattern = /<[^>]+>/g; + if (htmlPattern.test(value)) return false; + return true; +}; + +// Custom validator to prevent XSS attacks by rejecting HTML/script content +export function NoXSS(validationOptions?: ValidationOptions) { + return function (object: object, propertyName: string) { + registerDecorator({ + name: 'noXSS', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + validator: { + validate: xssValidator, + defaultMessage(args: ValidationArguments) { + return `${args.property} contains potentially dangerous content`; + }, + }, + }); + }; +} + +// Transform decorator to sanitize input by removing HTML tags +export function SanitizeHTML() { + return function (target: any, propertyName: string) { + const descriptor = Object.getOwnPropertyDescriptor(target, propertyName); + Object.defineProperty(target, propertyName, { + get: descriptor?.get, + set(value: any) { + if (typeof value === 'string') { + // Remove HTML tags + value = value.replace(/<[^>]*>/g, ''); + // Decode HTML entities + value = value + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, '\'') + .replace(///g, '/'); + } + descriptor?.set?.call(this, value); + }, + enumerable: true, + configurable: true, + }); + }; +} diff --git a/apps/backend/src/config/auth.config.ts b/apps/backend/src/config/auth.config.ts new file mode 100644 index 0000000..346d2f1 --- /dev/null +++ b/apps/backend/src/config/auth.config.ts @@ -0,0 +1,47 @@ +import * as Joi from 'joi'; +import ms from 'ms'; +import { registerAs } from '@nestjs/config'; + +const env = process.env; + +export const authValidationSchema = { + AUTH_SALT_ROUNDS: Joi.number().default(10), + AUTH_JWT_ISSUER: Joi.string().default('App'), + AUTH_JWT_SECRET: Joi.string().default('auth-jwt-secret'), + AUTH_JWT_EXPIRES_IN: Joi.string().default('7d'), + AUTH_COOKIE_NAME: Joi.string().default('access_token'), +}; + +export interface JwtConfig { + issuer: string; + secret: string; + expiresInMs: number; +} + +export interface JwtCookieConfig { + name: string; + signed: boolean; + secure: boolean; + httpOnly: boolean; +} + +export interface AuthConfig { + saltRounds: number; + jwt: JwtConfig; + cookie: JwtCookieConfig; +} + +export default registerAs('auth', () => ({ + saltRounds: parseInt(env.AUTH_SALT_ROUNDS as string, 10), + jwt: { + issuer: env.AUTH_JWT_ISSUER, + secret: env.AUTH_JWT_SECRET, + expiresInMs: ms(env.AUTH_JWT_EXPIRES_IN), + }, + cookie: { + name: env.AUTH_COOKIE_NAME, + httpOnly: true, + secure: true, + signed: true, + }, +})); diff --git a/apps/backend/src/config/db.config.ts b/apps/backend/src/config/db.config.ts new file mode 100644 index 0000000..8fc8e8f --- /dev/null +++ b/apps/backend/src/config/db.config.ts @@ -0,0 +1,35 @@ +import * as Joi from 'joi'; +import yn from 'yn'; +import { registerAs } from '@nestjs/config'; + +const env = process.env; + +export const dbValidationSchema = { + DATABASE_HOST: Joi.string().default('localhost'), + DATABASE_PORT: Joi.number().default(5432), + DATABASE_NAME: Joi.string().default('app'), + DATABASE_USERNAME: Joi.string().default('dev'), + DATABASE_PASSWORD: Joi.string().default('dev'), + DATABASE_SSL: Joi.boolean().default(false), + DATABASE_LOGGING: Joi.boolean().default(false), +}; + +export interface DbConfig { + host: string; + port: number; + name: string; + username: string; + password: string; + ssl: boolean; + logging: boolean; +} + +export default registerAs('database', () => ({ + host: env.DATABASE_HOST, + port: parseInt(env.DATABASE_PORT as string, 10), + user: env.DATABASE_USERNAME, + password: env.DATABASE_PASSWORD, + dbName: env.DATABASE_NAME, + ssl: yn(env.DATABASE_SSL), + debug: yn(env.DATABASE_LOGGING), +})); diff --git a/apps/backend/src/config/general.config.ts b/apps/backend/src/config/general.config.ts new file mode 100644 index 0000000..98a4190 --- /dev/null +++ b/apps/backend/src/config/general.config.ts @@ -0,0 +1,48 @@ +import * as Joi from 'joi'; +import { resolveOrigin } from '@app/config'; + +const env = process.env; + +export const generalValidationSchema = { + HOSTNAME: Joi.string().default('localhost'), + PORT: Joi.number().default(3000), + REVERSE_PROXY_PORT: Joi.number().default(3000), + NODE_ENV: Joi.string() + .valid('development', 'production', 'test', 'staging') + .default('development'), + LOG_LEVEL: Joi.string() + .valid('trace', 'debug', 'info', 'warn', 'error', 'fatal') + .default('info'), + CORS_ALLOWED_ORIGINS: Joi.string().default('http://localhost:3000'), + SENTRY_DSN: Joi.string().optional().allow(''), +}; + +export interface GeneralConfig { + hostname: string; + port: number; + protocol: string; + origin: string; + nodeEnv: string; + isProduction: boolean; + logLevel: string; + corsAllowedOrigins: string[]; + sentryDsn?: string; +} + +export default () => { + const { protocol, port, hostname, origin } = resolveOrigin(env); + return { + origin, + hostname, + port, + protocol, + nodeEnv: env.NODE_ENV, + isProduction: env.NODE_ENV === 'production', + logLevel: env.LOG_LEVEL, + corsAllowedOrigins: (env.CORS_ALLOWED_ORIGINS as string) + .split(',') + .filter((s) => s) + .map((s) => s.trim()), + sentryDsn: env.SENTRY_DSN, + }; +}; diff --git a/apps/backend/src/config/index.ts b/apps/backend/src/config/index.ts new file mode 100644 index 0000000..550c889 --- /dev/null +++ b/apps/backend/src/config/index.ts @@ -0,0 +1,6 @@ +export * from './auth.config'; +export * from './db.config'; +export * from './general.config'; +export * from './mail.config'; +export * from './mikro-orm.config'; +export * from './validation'; diff --git a/apps/backend/src/config/lib/pino.config.ts b/apps/backend/src/config/lib/pino.config.ts new file mode 100644 index 0000000..dbbdec7 --- /dev/null +++ b/apps/backend/src/config/lib/pino.config.ts @@ -0,0 +1,36 @@ +import { randomUUID } from 'crypto'; + +const resolvePinoTransport = (isProduction: boolean) => { + if (isProduction) return; + return { + target: require.resolve('pino-pretty'), + options: { + colorize: true, + translateTime: 'SYS:standard', + ignore: 'pid,hostname', + }, + }; +}; + +export default (level, isProd) => ({ + pinoHttp: { + level, + // prevent req from being attached to child loggers + // this prevents requests from being logged upon every child logger call + // while still allowing us to log request info in the main logger + // (e.g. upon logging in services, request info is not repeated) + quietReqLogger: true, + autoLogging: { ignore: () => false }, + transport: resolvePinoTransport(isProd), + genReqId: (req) => req.headers['x-request-id'] || randomUUID(), + customProps: (req) => ({ reqId: req.id }), + customSuccessMessage: (req, res) => + `${req.method} ${req.url} โ†’ ${res.statusCode}`, + customErrorMessage: (req, res, { message }) => + `${req.method} ${req.url} โ†’ ${res.statusCode} - ${message}`, + serializers: { + req: (req) => ({ method: req.method, url: req.url }), + res: (res) => ({ statusCode: res.statusCode }), + }, + }, +}); diff --git a/apps/backend/src/config/mail.config.ts b/apps/backend/src/config/mail.config.ts new file mode 100644 index 0000000..3b713ae --- /dev/null +++ b/apps/backend/src/config/mail.config.ts @@ -0,0 +1,43 @@ +import * as Joi from 'joi'; +import yn from 'yn'; +import { registerAs } from '@nestjs/config'; + +const env = process.env; + +export const mailValidationSchema = { + MAIL_HOST: Joi.string().default('email-smtp.us-east-1.amazonaws.com'), + MAIL_PORT: Joi.number().default(null), + MAIL_USER: Joi.string().allow(''), + MAIL_PASSWORD: Joi.string().allow(''), + MAIL_SECURE: Joi.boolean().default(false), + MAIL_FROM_NAME: Joi.string().default('App'), + MAIL_FROM_EMAIL: Joi.string().email().default('noreply@example.com'), +}; + +export interface MailConfig { + host: string; + port?: number; + secure: boolean; + auth: { + user?: string; + pass?: string; + }; + from: { + name: string; + email: string; + }; +} + +export default registerAs('mail', () => ({ + host: env.MAIL_HOST, + port: parseInt(env.MAIL_PORT as string, 10), + secure: yn(env.MAIL_SECURE), + auth: { + user: env.MAIL_USER, + pass: env.MAIL_PASSWORD, + }, + from: { + name: env.MAIL_FROM_NAME || 'App Starter', + email: env.MAIL_FROM_EMAIL || 'noreply@appstarter.com', + }, +})); diff --git a/apps/backend/src/config/mikro-orm.config.ts b/apps/backend/src/config/mikro-orm.config.ts new file mode 100644 index 0000000..e3e3223 --- /dev/null +++ b/apps/backend/src/config/mikro-orm.config.ts @@ -0,0 +1,44 @@ +import kebabCase from 'lodash/kebabCase'; +import { registerAs } from '@nestjs/config'; +import type { MikroOrmModuleSyncOptions } from '@mikro-orm/nestjs'; +import { Migrator } from '@mikro-orm/migrations'; +import { SeedManager } from '@mikro-orm/seeder'; +import { SqlHighlighter } from '@mikro-orm/sql-highlighter'; +import { TsMorphMetadataProvider } from '@mikro-orm/reflection'; +import { PostgreSqlDriver } from '@mikro-orm/postgresql'; + +export default registerAs('mikroORM', (): MikroOrmModuleSyncOptions => ({ + driver: PostgreSqlDriver, + entities: ['./dist/**/*.entity.js'], + entitiesTs: ['./src/**/*.entity.ts'], + highlighter: new SqlHighlighter(), + metadataProvider: TsMorphMetadataProvider, + seeder: { + fileName: (className: string) => kebabCase(className), + path: './dist/database/seeders', + pathTs: './src/database/seeders', + defaultSeeder: 'DatabaseSeeder', + glob: '!(*.d).{js,ts}', + emit: 'ts', + }, + migrations: { + fileName: (timestamp) => `${timestamp}-new-migration`, + path: './dist/database/migrations', + pathTs: './src/database/migrations', + snapshot: true, + transactional: true, + disableForeignKeys: true, + allOrNothing: true, + dropTables: true, + safe: false, + emit: 'ts', + }, + extensions: [Migrator, SeedManager], + pool: { min: 2, max: 10 }, + forceUtcTimezone: true, + discovery: { + warnWhenNoEntities: true, + requireEntitiesArray: false, + alwaysAnalyseProperties: true, + }, +})); diff --git a/apps/backend/src/config/validation.ts b/apps/backend/src/config/validation.ts new file mode 100644 index 0000000..64f56f1 --- /dev/null +++ b/apps/backend/src/config/validation.ts @@ -0,0 +1,13 @@ +import * as Joi from 'joi'; + +import { authValidationSchema } from './auth.config'; +import { dbValidationSchema } from './db.config'; +import { generalValidationSchema } from './general.config'; +import { mailValidationSchema } from './mail.config'; + +export const validationSchema = Joi.object({ + ...authValidationSchema, + ...dbValidationSchema, + ...generalValidationSchema, + ...mailValidationSchema, +}); diff --git a/apps/backend/src/database/entities/base.entity.ts b/apps/backend/src/database/entities/base.entity.ts new file mode 100644 index 0000000..e774f47 --- /dev/null +++ b/apps/backend/src/database/entities/base.entity.ts @@ -0,0 +1,28 @@ +import { Property, PrimaryKey } from '@mikro-orm/core'; +import { randomUUID } from 'node:crypto'; + +export abstract class BaseEntity { + @PrimaryKey({ type: 'uuid' }) + id: string = randomUUID(); + + @Property({ onCreate: () => new Date() }) + createdAt: Date = new Date(); + + @Property({ onUpdate: () => new Date() }) + updatedAt: Date = new Date(); + + @Property({ nullable: true }) + deletedAt?: Date | null = null; + + softDelete(): void { + this.deletedAt = new Date(); + } + + restore(): void { + this.deletedAt = undefined; + } + + get isDeleted(): boolean { + return !!this.deletedAt; + } +} diff --git a/apps/backend/src/database/entities/index.ts b/apps/backend/src/database/entities/index.ts new file mode 100644 index 0000000..c3421a4 --- /dev/null +++ b/apps/backend/src/database/entities/index.ts @@ -0,0 +1,2 @@ +export * from './base.entity'; +export * from './user.entity'; diff --git a/apps/backend/src/database/entities/user.entity.ts b/apps/backend/src/database/entities/user.entity.ts new file mode 100644 index 0000000..39bc496 --- /dev/null +++ b/apps/backend/src/database/entities/user.entity.ts @@ -0,0 +1,114 @@ +import * as bcrypt from 'bcrypt'; +import type { + EventArgs } from '@mikro-orm/core'; +import { + BeforeCreate, + BeforeUpdate, + Entity, + Enum, + Index, + Property, +} from '@mikro-orm/core'; +import { Exclude } from 'class-transformer'; +import { BaseEntity } from './base.entity'; +import { UserRepository } from '@/modules/user/user.repository'; + +export enum UserRole { + ADMIN = 'ADMIN', + USER = 'USER', +} + +@Entity({ tableName: 'users', repository: () => UserRepository }) +export class User extends BaseEntity { + @Property({ unique: true, nullable: false }) + @Index() + email!: string; + + @Property({ hidden: true, nullable: false }) + @Exclude() + password!: string; + + @Enum(() => UserRole) + role: UserRole = UserRole.USER; + + @Property({ nullable: true, length: 200 }) + firstName?: string; + + @Property({ nullable: true, length: 200 }) + lastName?: string; + + @Property({ nullable: true, type: 'text' }) + imgUrl?: string; + + @Property({ nullable: true }) + lastLoginAt?: Date; + + @Property({ persist: false }) + get isAdmin(): boolean { + return this.role === UserRole.ADMIN; + } + + @Property({ persist: false }) + get fullName(): string | null { + const { firstName, lastName } = this; + return firstName && lastName + ? `${firstName} ${lastName}` + : firstName || lastName || null; + } + + @Property({ persist: false }) + get label(): string { + return this.fullName || this.email; + } + + @Property({ persist: false }) + get profile() { + return { + id: this.id, + email: this.email, + role: this.role, + label: this.label, + imgUrl: this.imgUrl, + createdAt: this.createdAt, + updatedAt: this.updatedAt, + }; + } + + @BeforeCreate() + @BeforeUpdate() + private async hashPassword(args: EventArgs) { + // Only hash if password is being set/changed and isn't already hashed + if (this.password && !this.password.startsWith('$2')) { + // Get saltRounds from MikroORM config (injected from ConfigService) + // Falls back to env for CLI operations like seeding + const config = args.em.config.getAll() as any; + const saltRounds = + config.saltRounds || parseInt(process.env.AUTH_SALT_ROUNDS || '10', 10); + this.password = await bcrypt.hash(this.password, saltRounds); + } + } + + @BeforeCreate() + @BeforeUpdate() + normalizeEmail() { + if (!this.email) return; + this.email = this.email.toLowerCase().trim(); + } + + async validatePassword(password: string): Promise { + if (!this.password) return false; + return bcrypt.compare(password, this.password); + } + + toJSON() { + const { password, refreshToken, ...user } = this as any; + return { + ...user, + profile: this.profile, + fullName: this.fullName, + label: this.label, + isAdmin: this.isAdmin, + isDeleted: this.isDeleted, + }; + } +} diff --git a/apps/backend/src/database/seeders/DatabaseSeeder.ts b/apps/backend/src/database/seeders/DatabaseSeeder.ts new file mode 100644 index 0000000..cccb3f5 --- /dev/null +++ b/apps/backend/src/database/seeders/DatabaseSeeder.ts @@ -0,0 +1,21 @@ +import { EntityManager } from '@mikro-orm/core'; +import { Seeder } from '@mikro-orm/seeder'; +import { User } from '../entities/user.entity'; +import users from '@app/seed/user.json'; + +export class DatabaseSeeder extends Seeder { + async run(em: EntityManager): Promise { + if (process.env.NODE_ENV === 'development') { + await em.nativeDelete(User, {}); + } + for (const it of users) { + em.create(User, it as any); + } + await em.flush(); + if (process.env.NODE_ENV !== 'test') { + console.log('โœ… Database seeded successfully'); + console.log(`๐Ÿ“ง Email: ${users[0].email}`); + console.log(`๐Ÿ”‘ Password: ${users[0].password}`); + } + } +} diff --git a/apps/backend/src/instrument.ts b/apps/backend/src/instrument.ts new file mode 100644 index 0000000..18496df --- /dev/null +++ b/apps/backend/src/instrument.ts @@ -0,0 +1,44 @@ +import * as Sentry from '@sentry/nestjs'; +import { nodeProfilingIntegration } from '@sentry/profiling-node'; + +// This MUST be imported before any other modules +// https://docs.sentry.io/platforms/javascript/guides/nestjs/ +// Extract environment check to avoid repeated comparisons +// Note: We can't use NestJS ConfigService here because this file must be imported +// before any other modules to properly instrument the application +const isProduction = process.env.NODE_ENV === 'production'; + +Sentry.init({ + dsn: process.env.SENTRY_DSN, + environment: process.env.NODE_ENV || 'development', + integrations: [nodeProfilingIntegration()], + debug: !isProduction, + enableLogs: true, + // Free tier: 10k transactions/month - adjust sampling for production + // 10% in prod, 100% in dev + tracesSampleRate: isProduction ? 0.1 : 1.0, + // Profile 100% of traced transactions for performance insights + profilesSampleRate: 1.0, + release: process.env.npm_package_version || '1.0.0', + beforeSend(event, hint) { + // Filter out sensitive information + if (event.request?.headers) { + delete event.request.headers.authorization; + delete event.request.headers.cookie; + } + // Skip certain errors in development + if (!isProduction) { + const error = hint.originalException; + if (error instanceof Error) { + // Skip common development errors + if (error.message.includes('ECONNREFUSED') || + error.message.includes('Cannot connect to the Docker daemon')) { + return null; + } + } + } + return event; + }, +}); + +console.log('โœ… Sentry instrumentation initialized'); diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts new file mode 100644 index 0000000..e793c8a --- /dev/null +++ b/apps/backend/src/main.ts @@ -0,0 +1,92 @@ +// Sentry must be imported FIRST, before any other modules +import './instrument'; + +import { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common'; +import { SwaggerModule } from '@nestjs/swagger'; +import { NestFactory, Reflector } from '@nestjs/core'; +import { AllExceptionsFilter } from './common/filters/all-exceptions.filter'; +import { AppModule } from './app.module'; +import { ConfigService } from '@nestjs/config'; +import { Logger } from 'nestjs-pino'; +import { HttpExceptionFilter } from './common/filters/http-exception.filter'; +import { LoggingInterceptor } from './common/interceptors/logging.interceptor'; +import { ResponseInterceptor } from './common/interceptors/response.interceptor'; +import { ThrottlerExceptionFilter } from './common/filters/throttler-exception.filter'; +import { ValidationExceptionFilter } from './common/filters/validation-exception.filter'; +import { generateOpenApiDocument, saveOpenApiSpec } from './utils/openapi'; +import cookieParser from 'cookie-parser'; +import helmet from 'helmet'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule, { bufferLogs: true }); + const config = app.get(ConfigService); + const reflector = app.get(Reflector); + app.useLogger(app.get(Logger)); + app.use(cookieParser(config.get('auth.jwt.secret'))); + app.use(helmet({ contentSecurityPolicy: false })); + app.enableCors({ + origin: config.get('corsAllowedOrigins'), + credentials: true, + }); + app.setGlobalPrefix('api'); + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + transformOptions: { enableImplicitConversion: true }, + validateCustomDecorators: true, + }), + ); + app.useGlobalInterceptors( + app.get(LoggingInterceptor), + new ClassSerializerInterceptor(reflector, { + excludeExtraneousValues: false, + enableImplicitConversion: false, + strategy: 'exposeAll', + }), + new ResponseInterceptor(), + ); + // Registered in reverse order of execution + // Order: Most specific โ†’ Most general + app.useGlobalFilters( + app.get(AllExceptionsFilter), // 4th: Catch-all for non-HTTP exceptions + app.get(HttpExceptionFilter), // 3rd: General HTTP exceptions + app.get(ValidationExceptionFilter), // 2nd: BadRequestException (validation) + app.get(ThrottlerExceptionFilter), // 1st: ThrottlerException + ); + if (!config.get('isProduction')) { + const document = generateOpenApiDocument(app); + // Save OpenAPI spec to file + // for offline access and build-time client generation + saveOpenApiSpec(document); + SwaggerModule.setup('api/docs', app, document, { + swaggerOptions: { + persistAuthorization: true, + docExpansion: 'none', + filter: true, + showRequestDuration: true, + }, + }); + } + // Set config cookie + app.use((req, res, next) => { + if (req.path === '/' || req.path === '/index.html') { + const configCookie = JSON.stringify( + Object.fromEntries( + Object.entries(process.env).filter(([key]) => + key.startsWith('NUXT_PUBLIC_'), + ), + ), + ); + res.cookie('config', configCookie); + } + next(); + }); + const port = config.get('port') as number; + await app.listen(port); + console.log(`๐Ÿš€ Application is running on: http://localhost:${port}/api`); + console.log(`๐Ÿ“š Swagger documentation: http://localhost:${port}/api/docs`); +} + +bootstrap(); diff --git a/apps/backend/src/modules/auth/auth.controller.ts b/apps/backend/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000..6e51bd9 --- /dev/null +++ b/apps/backend/src/modules/auth/auth.controller.ts @@ -0,0 +1,129 @@ +import { ApiBody, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { + Body, + Controller, + Get, + HttpCode, + HttpStatus, + Post, + Res, +} from '@nestjs/common'; +import { + ChangePasswordDto, + ForgotPasswordDto, + LoginDto, + ResetPasswordDto, + LoginResponseDto, + ChangePasswordResponseDto, +} from './dto'; +import { AuthService } from './auth.service'; +import { ConfigService } from '@nestjs/config'; +import { CurrentUser } from '@/modules/auth/decorators/current-user.decorator'; +import { Public } from './decorators'; +import type { Response } from 'express'; + +@ApiTags('auth') +@Controller('auth') +export class AuthController { + constructor( + private readonly authService: AuthService, + private readonly configService: ConfigService, + ) {} + + @ApiOperation({ summary: 'User login' }) + @ApiBody({ type: LoginDto }) + @ApiResponse({ + status: 200, + description: 'User logged in successfully', + type: LoginResponseDto, + }) + @ApiResponse({ + status: 401, + description: 'The email or password you entered is incorrect.', + }) + @Public() + @Post('login') + @HttpCode(HttpStatus.OK) + async login( + @Body() loginDto: LoginDto, + @Res({ passthrough: true }) response: Response, + ) { + const { user, accessToken, expiresInMs } = + await this.authService.login(loginDto); + const cookieConfig = this.configService.get('auth.cookie'); + response.cookie(cookieConfig.name, accessToken, { + httpOnly: cookieConfig.httpOnly, + signed: cookieConfig.signed, + maxAge: expiresInMs, + secure: this.configService.get('isProduction'), + }); + return { user, accessToken, expiresIn: expiresInMs }; + } + + @Get('logout') + @ApiOperation({ summary: 'User logout' }) + @ApiResponse({ status: 200, description: 'User logged out successfully' }) + @HttpCode(HttpStatus.OK) + async logout( + @CurrentUser() user: any, + @Res({ passthrough: true }) response: Response, + ): Promise { + await this.authService.logout(user); + const cookieConfig = this.configService.get('auth.cookie'); + response.clearCookie(cookieConfig.name); + } + + @ApiOperation({ summary: 'Change current password' }) + @ApiBody({ type: ChangePasswordDto }) + @ApiResponse({ + status: 200, + description: 'Password changed successfully', + type: ChangePasswordResponseDto, + }) + @ApiResponse({ status: 400, description: 'Current password is incorrect!' }) + @Post('change-password') + @HttpCode(HttpStatus.OK) + async changePassword( + @CurrentUser() user: any, + @Body() changePasswordDto: ChangePasswordDto, + ): Promise<{ message: string }> { + return this.authService.changePassword(user, changePasswordDto); + } + + @ApiOperation({ summary: 'Request password reset' }) + @ApiBody({ type: ForgotPasswordDto }) + @ApiResponse({ + status: 200, + description: 'Password reset email sent if user exists', + }) + @Public() + @Post('forgot-password') + @HttpCode(HttpStatus.OK) + async forgotPassword( + @Body() forgotPasswordDto: ForgotPasswordDto, + ): Promise { + await this.authService.sendResetPasswordToken(forgotPasswordDto); + } + + @ApiOperation({ summary: 'Reset password with token' }) + @ApiBody({ type: ResetPasswordDto }) + @ApiResponse({ status: 204, description: 'Password reset successfully' }) + @ApiResponse({ status: 400, description: 'Invalid or expired token' }) + @Public() + @Post('reset-password') + @HttpCode(HttpStatus.NO_CONTENT) + async resetPassword( + @Body() resetPasswordDto: ResetPasswordDto, + ): Promise { + await this.authService.resetPassword(resetPasswordDto); + } + + @ApiOperation({ summary: 'Validate reset token' }) + @ApiResponse({ status: 202, description: 'Token is valid' }) + @Public() + @Post('reset-password/token-status') + @HttpCode(HttpStatus.ACCEPTED) + async validateResetToken(@Body('token') token: string): Promise { + await this.authService.validateResetPasswordToken(token); + } +} diff --git a/apps/backend/src/modules/auth/auth.module.ts b/apps/backend/src/modules/auth/auth.module.ts new file mode 100644 index 0000000..7022540 --- /dev/null +++ b/apps/backend/src/modules/auth/auth.module.ts @@ -0,0 +1,44 @@ +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { JwtAuthGuard, RolesGuard } from './guards'; +import { JwtStrategy, LocalStrategy } from './strategies'; +import { forwardRef, Module } from '@nestjs/common'; +import { APP_GUARD } from '@nestjs/core'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { JwtModule } from '@nestjs/jwt'; +import { MailModule } from '../mail/mail.module'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import ms from 'ms'; +import { PassportModule } from '@nestjs/passport'; +import { User } from '@/database/entities'; +import { UserModule } from '../user/user.module'; + +@Module({ + imports: [ + forwardRef(() => UserModule), + MailModule, + MikroOrmModule.forFeature([User]), + PassportModule.register({ defaultStrategy: 'jwt' }), + JwtModule.registerAsync({ + imports: [ConfigModule], + useFactory: async (configService: ConfigService) => ({ + secret: configService.get('auth.jwt.secret'), + signOptions: { + expiresIn: ms(configService.get('auth.jwt.expiresInMs')), + }, + }), + inject: [ConfigService], + }), + ], + controllers: [AuthController], + providers: [ + AuthService, + LocalStrategy, + JwtStrategy, + // All routes protected by default & global role-based access control + { provide: APP_GUARD, useClass: JwtAuthGuard }, + { provide: APP_GUARD, useClass: RolesGuard }, + ], + exports: [AuthService], +}) +export class AuthModule {} diff --git a/apps/backend/src/modules/auth/auth.service.ts b/apps/backend/src/modules/auth/auth.service.ts new file mode 100644 index 0000000..b32cfcc --- /dev/null +++ b/apps/backend/src/modules/auth/auth.service.ts @@ -0,0 +1,222 @@ +import { + BadRequestException, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import type { + ChangePasswordDto, + ForgotPasswordDto, + LoginDto, + ResetPasswordDto, +} from './dto'; +import type { AuthConfig } from '@/config'; +import { EntityManager } from '@mikro-orm/core'; +import { ConfigService } from '@nestjs/config'; +import type { JwtPayload } from './strategies/jwt.strategy'; +import { JwtService } from '@nestjs/jwt'; +import { InjectRepository } from '@mikro-orm/nestjs'; +import { MailService } from '@/modules/mail/mail.service'; +import { PinoLogger } from 'nestjs-pino'; +import { User } from '@/database/entities'; +import { UserRepository } from '@/modules/user/user.repository'; + +import * as bcrypt from 'bcrypt'; +import ms from 'ms'; + +export enum Audience { + ACCESS = 'scope:access', + INVITATION = 'scope:invitation', + RESET = 'scope:reset', +} + +@Injectable() +export class AuthService { + private config: AuthConfig; + + constructor( + @InjectRepository(User) + private readonly userRepository: UserRepository, + private readonly em: EntityManager, + private readonly configService: ConfigService, + private readonly mailService: MailService, + private readonly jwtService: JwtService, + private readonly logger: PinoLogger, + ) { + this.config = configService.get('auth') as AuthConfig; + this.logger.setContext(AuthService.name); + } + + async login({ email, password }: LoginDto) { + this.logger.debug(`Login attempt for email: ${email}`); + const user = await this.validateCredentials(email, password); + if (!user) { + this.logger.info(`Login attempt failed: ${email}`); + throw new UnauthorizedException( + 'The email or password you entered is incorrect.', + ); + } + const { accessToken, expiresInMs } = await this.createAccessToken(user); + this.logger.debug(`Login success for email: ${email}`); + return { user: user.toJSON(), accessToken, expiresInMs }; + } + + async logout(user: User): Promise { + this.logger.debug(`Logout attempt for email: ${user.email}`); + // TODO: Figure out better name for this field + user.lastLoginAt = new Date(); + await this.em.flush(); + this.logger.debug(`Logout success for email: ${user.email}`); + } + + async validateCredentials( + email: string, + pw: string, + ): Promise { + this.logger.debug(`Validating credentials for email: ${email}`); + const user = await this.userRepository.findByEmail(email); + if (!user || user.isDeleted) { + this.logger.info(`No user found or user is deleted for email: ${email}`); + return; + } + const isValidPassword = await user.validatePassword(pw); + if (!isValidPassword) { + this.logger.debug(`Invalid password for email: ${email}`); + return; + } + this.logger.debug(`Credentials validated for email: ${email}`); + return user; + } + + async changePassword( + user: User, + { currentPassword, newPassword }: ChangePasswordDto, + ): Promise<{ message: string }> { + this.logger.debug(`Change password attempt for email: ${user.email}`); + const isValid = await user.validatePassword(currentPassword); + if (!isValid) { + this.logger.debug(`Invalid current password for email: ${user.email}`); + throw new BadRequestException('Current password is incorrect'); + } + user.password = await this.hashPassword(newPassword); + await this.em.flush(); + this.logger.debug(`Password changed for email: ${user.email}`); + return { message: 'Password has been changed successfully' }; + } + + async resetPassword({ token, newPassword }: ResetPasswordDto): Promise { + this.logger.debug('Reset password attempt'); + const user = await this.validateResetPasswordToken(token); + this.logger.debug(`Reset password request for user: ${user.email}`); + user.password = await this.hashPassword(newPassword); + await this.em.flush(); + this.logger.debug(`Password has been reset for user: ${user.email}`); + } + + async validateResetPasswordToken(token: string): Promise { + this.logger.debug('Validating reset password token'); + try { + const payload: JwtPayload = this.jwtService.decode(token); + if (!payload?.sub || payload.aud !== Audience.RESET) { + this.logger.debug(`Invalid reset token payload`); + throw new BadRequestException('Invalid reset token'); + } + const user = await this.userRepository.get(payload.sub); + if (!user || user.isDeleted) { + this.logger.debug('No user found for token'); + throw new BadRequestException('Invalid token'); + } + const secret = this.getTokenSecret(user); + await this.jwtService.verify(token, { secret }); + this.logger.debug(`Reset token validated for user: ${user.email}`); + return user; + } catch { + throw new BadRequestException('Invalid or expired reset token'); + } + } + + async sendResetPasswordToken({ email }: ForgotPasswordDto): Promise { + this.logger.debug(`Password reset email request for: ${email}`); + const user = await this.userRepository.findByEmail(email); + if (!user || user.isDeleted) { + this.logger.info(`No user found or user is deleted for email: ${email}`); + return; + } + const token = await this.createToken(user, Audience.RESET, { + secret: this.getTokenSecret(user), + expiresInMs: ms('1h'), + }); + try { + await this.mailService.sendPasswordResetEmail(user, token); + this.logger.debug(`Sent reset email to: ${email}`); + } catch (err) { + this.logger.info('Failed to send password reset email:', err); + } + } + + async sendInvitationEmail(user: User): Promise { + this.logger.debug(`Sending invitation email to: ${user.email}`); + const token = await this.createInvitationToken(user); + return this.mailService.sendInvitationEmail(user, token); + } + + private async createAccessToken(user: User) { + this.logger.debug(`Creating access token for user: ${user.email}`); + user.lastLoginAt = new Date(); + const { expiresInMs } = this.config.jwt; + const accessToken = await this.createToken(user, Audience.ACCESS, { + expiresInMs, + }); + await this.em.flush(); + this.logger.debug(`Access token created for user: ${user.email}`); + return { + user, + accessToken, + expiresInMs, + }; + } + + private async createInvitationToken(user: User): Promise { + this.logger.debug(`Creating invitation token for user: ${user.email}`); + const secret = this.getTokenSecret(user); + // Reset tokens are used for invitations as well + // This allows the same endpoint to be used for both + const token = await this.createToken(user, Audience.RESET, { + secret, + expiresInMs: ms('7d'), + }); + this.logger.debug(`Invitation token created for user: ${user.email}`); + return token; + } + + private async createToken( + user: User, + audience: string, + { secret, expiresInMs }: { secret?: string; expiresInMs?: number } = {}, + ): Promise { + const config = this.config.jwt; + expiresInMs = expiresInMs || config.expiresInMs; + const payload: JwtPayload = { + sub: user.id, + email: user.email, + role: user.role, + iat: Date.now(), + }; + return this.jwtService.signAsync(payload, { + secret: secret || config.secret, + expiresIn: ms(expiresInMs), + audience, + issuer: config.issuer, + }); + } + + // Use a combination of JWT secret, user pw hash, and creation time + // This ensures the token becomes invalid if the password is changed + private getTokenSecret(user: User): string { + const baseSecret = this.config.jwt.secret; + return `${baseSecret}-${user.password}-${user.createdAt.getTime()}`; + } + + private async hashPassword(password: string): Promise { + return bcrypt.hash(password, this.config.saltRounds); + } +} diff --git a/apps/backend/src/modules/auth/decorators/current-user.decorator.ts b/apps/backend/src/modules/auth/decorators/current-user.decorator.ts new file mode 100644 index 0000000..a5b2abf --- /dev/null +++ b/apps/backend/src/modules/auth/decorators/current-user.decorator.ts @@ -0,0 +1,25 @@ +import type { ExecutionContext } from '@nestjs/common'; +import { createParamDecorator } from '@nestjs/common'; + +/** + * Custom parameter decorator to extract the current user from the request. + * + * @param dataKey - Optional key to extract a specific property from the user object + * @returns The user object or a specific property if dataKey is provided + * + * @example + * async getProfile(@CurrentUser() user: any) { } + * Get a specific property + * async getEmail(@CurrentUser('email') email: string) { } + * Note: Do not use User entity as the type annotation, as it will + * cause serialization issues. + */ +export const CurrentUser = createParamDecorator( + (dataKey: string | undefined, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + const user = request.user; + if (!user) return null; + if (dataKey) return user[dataKey]; + return user; + }, +); diff --git a/apps/backend/src/modules/auth/decorators/index.ts b/apps/backend/src/modules/auth/decorators/index.ts new file mode 100644 index 0000000..16ac445 --- /dev/null +++ b/apps/backend/src/modules/auth/decorators/index.ts @@ -0,0 +1,2 @@ +export * from './public.decorator'; +export * from './roles.decorator'; diff --git a/apps/backend/src/modules/auth/decorators/public.decorator.ts b/apps/backend/src/modules/auth/decorators/public.decorator.ts new file mode 100644 index 0000000..a7b2022 --- /dev/null +++ b/apps/backend/src/modules/auth/decorators/public.decorator.ts @@ -0,0 +1,4 @@ +import { SetMetadata } from '@nestjs/common'; + +export const IS_PUBLIC_FLAG_KEY = 'isPublicRoute'; +export const Public = () => SetMetadata(IS_PUBLIC_FLAG_KEY, true); diff --git a/apps/backend/src/modules/auth/decorators/roles.decorator.ts b/apps/backend/src/modules/auth/decorators/roles.decorator.ts new file mode 100644 index 0000000..f8a817e --- /dev/null +++ b/apps/backend/src/modules/auth/decorators/roles.decorator.ts @@ -0,0 +1,6 @@ +import { SetMetadata } from '@nestjs/common'; +import type { UserRole } from '@/database/entities'; + +export const ALLOWED_ROLES_KEY = 'allowedUserRoles'; +export const Roles = (...roles: UserRole[]) => + SetMetadata(ALLOWED_ROLES_KEY, roles); diff --git a/apps/backend/src/modules/auth/dto/index.ts b/apps/backend/src/modules/auth/dto/index.ts new file mode 100644 index 0000000..8dd2e3d --- /dev/null +++ b/apps/backend/src/modules/auth/dto/index.ts @@ -0,0 +1,2 @@ +export * from './login.dto'; +export * from './reset-password.dto'; diff --git a/apps/backend/src/modules/auth/dto/login.dto.ts b/apps/backend/src/modules/auth/dto/login.dto.ts new file mode 100644 index 0000000..2f9d6d3 --- /dev/null +++ b/apps/backend/src/modules/auth/dto/login.dto.ts @@ -0,0 +1,37 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsEmail, IsNotEmpty, IsString, MinLength } from 'class-validator'; +import { Transform } from 'class-transformer'; + +import { UserDto } from '@/modules/user/dto/user-response.dto'; + +export class LoginDto { + @ApiProperty({ + description: 'User email address', + example: 'user@example.com', + }) + @IsEmail() + @IsNotEmpty() + @Transform(({ value }) => value?.toLowerCase().trim()) + email: string; + + @ApiProperty({ + description: 'User password', + example: 'password123', + minLength: 8, + }) + @IsString() + @IsNotEmpty() + @MinLength(8) + password: string; +} + +export class LoginResponseDto { + @ApiProperty({ type: UserDto }) + user: UserDto; + + @ApiProperty({ description: 'JWT access token' }) + accessToken: string; + + @ApiProperty({ description: 'Token expiration time in milliseconds' }) + expiresInMs: number; +} diff --git a/apps/backend/src/modules/auth/dto/reset-password.dto.ts b/apps/backend/src/modules/auth/dto/reset-password.dto.ts new file mode 100644 index 0000000..ba2391a --- /dev/null +++ b/apps/backend/src/modules/auth/dto/reset-password.dto.ts @@ -0,0 +1,77 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { + IsEmail, + IsJWT, + IsNotEmpty, + IsString, + Matches, + MinLength, +} from 'class-validator'; +import { oneLine } from 'common-tags'; +import { Transform } from 'class-transformer'; + +const PW_REGEX = + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]/; + +const PW_REGEX_MESSAGE = oneLine` + Password must contain at least one + uppercase letter, one lowercase letter, one number, + and one special character`; + +export class ForgotPasswordDto { + @ApiProperty({ + description: 'Email address to send reset link to', + example: 'user@example.com', + }) + @IsEmail() + @IsNotEmpty() + @Transform(({ value }) => value?.toLowerCase().trim()) + email: string; +} + +export class ResetPasswordDto { + @ApiProperty({ + description: 'Password reset token', + example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', + }) + @IsJWT() + @IsNotEmpty() + token: string; + + @ApiProperty({ + description: 'New password', + example: 'NewSecureP@ssw0rd', + minLength: 8, + }) + @IsString() + @IsNotEmpty() + @MinLength(8) + @Matches(PW_REGEX, { message: PW_REGEX_MESSAGE }) + newPassword: string; +} + +export class ChangePasswordDto { + @ApiProperty({ + description: 'Current password', + example: 'OldPassword123', + }) + @IsString() + @IsNotEmpty() + currentPassword: string; + + @ApiProperty({ + description: 'New password', + minLength: 8, + example: 'NewSecureP@ssw0rd', + }) + @IsString() + @IsNotEmpty() + @MinLength(8) + @Matches(PW_REGEX, { message: PW_REGEX_MESSAGE }) + newPassword: string; +} + +export class ChangePasswordResponseDto { + @ApiProperty({ description: 'Success message' }) + message: string; +} diff --git a/apps/backend/src/modules/auth/guards/index.ts b/apps/backend/src/modules/auth/guards/index.ts new file mode 100644 index 0000000..63b8cec --- /dev/null +++ b/apps/backend/src/modules/auth/guards/index.ts @@ -0,0 +1,3 @@ +export * from './jwt-auth.guard'; +export * from './local-auth.guard'; +export * from './roles.guard'; diff --git a/apps/backend/src/modules/auth/guards/jwt-auth.guard.ts b/apps/backend/src/modules/auth/guards/jwt-auth.guard.ts new file mode 100644 index 0000000..8ba245c --- /dev/null +++ b/apps/backend/src/modules/auth/guards/jwt-auth.guard.ts @@ -0,0 +1,31 @@ +import type { + ExecutionContext } from '@nestjs/common'; +import { + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; +import { Reflector } from '@nestjs/core'; +import { IS_PUBLIC_FLAG_KEY } from '../decorators/public.decorator'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') { + constructor(private reflector: Reflector) { + super(); + } + + canActivate(context: ExecutionContext) { + const isPublic = this.reflector.getAllAndOverride( + IS_PUBLIC_FLAG_KEY, + [context.getHandler(), context.getClass()], + ); + if (isPublic) return true; + return super.canActivate(context); + } + + handleRequest(err: any, user: any, _info: any) { + if (err || !user) + throw err || new UnauthorizedException('Authentication required'); + return user; + } +} diff --git a/apps/backend/src/modules/auth/guards/local-auth.guard.ts b/apps/backend/src/modules/auth/guards/local-auth.guard.ts new file mode 100644 index 0000000..fb638ae --- /dev/null +++ b/apps/backend/src/modules/auth/guards/local-auth.guard.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +// Used only in AuthController for login route +@Injectable() +export class LocalAuthGuard extends AuthGuard('local') {} diff --git a/apps/backend/src/modules/auth/guards/roles.guard.ts b/apps/backend/src/modules/auth/guards/roles.guard.ts new file mode 100644 index 0000000..381c5d1 --- /dev/null +++ b/apps/backend/src/modules/auth/guards/roles.guard.ts @@ -0,0 +1,21 @@ +import type { CanActivate, ExecutionContext } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { ALLOWED_ROLES_KEY } from '../decorators/roles.decorator'; +import type { UserRole } from '@/database/entities'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const allowedRoles = this.reflector.getAllAndOverride( + ALLOWED_ROLES_KEY, + [context.getHandler(), context.getClass()], + ); + if (!allowedRoles) return true; + const { user } = context.switchToHttp().getRequest(); + if (!user) return false; + return allowedRoles.some((role) => user.role === role); + } +} diff --git a/apps/backend/src/modules/auth/strategies/index.ts b/apps/backend/src/modules/auth/strategies/index.ts new file mode 100644 index 0000000..e8ecb68 --- /dev/null +++ b/apps/backend/src/modules/auth/strategies/index.ts @@ -0,0 +1,2 @@ +export * from './local.strategy'; +export * from './jwt.strategy'; diff --git a/apps/backend/src/modules/auth/strategies/jwt.strategy.ts b/apps/backend/src/modules/auth/strategies/jwt.strategy.ts new file mode 100644 index 0000000..a2d24ad --- /dev/null +++ b/apps/backend/src/modules/auth/strategies/jwt.strategy.ts @@ -0,0 +1,55 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { ConfigService } from '@nestjs/config'; +import type { EntityRepository } from '@mikro-orm/core'; +import { InjectRepository } from '@mikro-orm/nestjs'; +import { PassportStrategy } from '@nestjs/passport'; +import type { Request } from 'express'; +import { User } from '@/database/entities'; + +export interface JwtPayload { + sub: string; + email: string; + role?: string; + iss?: string; + aud?: string; + iat?: number; + exp?: number; +} + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy) { + constructor( + private configService: ConfigService, + @InjectRepository(User) + private userRepository: EntityRepository, + ) { + const jwtSecret = configService.get('auth.jwt.secret'); + if (!jwtSecret) { + throw new Error('JWT secret is not configured'); + } + + super({ + jwtFromRequest: ExtractJwt.fromExtractors([ + (req: Request) => { + const { cookies, signedCookies } = req || {}; + return cookies?.access_token || signedCookies?.access_token || null; + }, + ExtractJwt.fromAuthHeaderAsBearerToken(), + ]), + ignoreExpiration: false, + secretOrKey: jwtSecret, + }); + } + + async validate({ sub, email }: JwtPayload): Promise { + const user = await this.userRepository.findOne( + { id: sub, email }, + { populate: false, refresh: true }, + ); + if (!user) throw new UnauthorizedException('User not found'); + if (user.isDeleted) + throw new UnauthorizedException('User account has been deactivated'); + return user; + } +} diff --git a/apps/backend/src/modules/auth/strategies/local.strategy.ts b/apps/backend/src/modules/auth/strategies/local.strategy.ts new file mode 100644 index 0000000..76b0155 --- /dev/null +++ b/apps/backend/src/modules/auth/strategies/local.strategy.ts @@ -0,0 +1,21 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { Strategy } from 'passport-local'; +import { AuthService } from '../auth.service'; +import type { User } from '@/database/entities'; + +@Injectable() +export class LocalStrategy extends PassportStrategy(Strategy) { + constructor(private authService: AuthService) { + super({ usernameField: 'email', passwordField: 'password' }); + } + + async validate(email: string, password: string): Promise { + const user = await this.authService.validateCredentials(email, password); + if (!user) + throw new UnauthorizedException( + 'The email or password you entered is incorrect.', + ); + return user; + } +} diff --git a/apps/backend/src/modules/health/health.controller.ts b/apps/backend/src/modules/health/health.controller.ts new file mode 100644 index 0000000..cba57fd --- /dev/null +++ b/apps/backend/src/modules/health/health.controller.ts @@ -0,0 +1,84 @@ +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { Controller, Get, ServiceUnavailableException } from '@nestjs/common'; +import { EntityManager } from '@mikro-orm/core'; +import { ConfigService } from '@nestjs/config'; +import { Public } from '@/modules/auth/decorators'; +import * as Sentry from '@sentry/nestjs'; + +@ApiTags('health') +@Controller() +export class HealthController { + constructor( + private readonly em: EntityManager, + private readonly config: ConfigService, + ) {} + + @ApiOperation({ summary: 'Basic health check' }) + @ApiResponse({ status: 200, description: 'Service is healthy' }) + @Public() + @Get('healthcheck') + healthCheck() { + return { status: 'ok', timestamp: new Date().toISOString() }; + } + + @ApiOperation({ summary: 'Liveness probe' }) + @ApiResponse({ status: 200, description: 'Service is alive' }) + @Public() + @Get('health/live') + liveness() { + return { status: 'alive', timestamp: new Date().toISOString() }; + } + + @ApiOperation({ summary: 'Readiness probe' }) + @ApiResponse({ status: 200, description: 'Service is ready' }) + @ApiResponse({ status: 503, description: 'Service is not ready' }) + @Public() + @Get('health/ready') + async readiness() { + try { + // Use a database-agnostic way to check connection + await this.em.getConnection().execute('SELECT 1'); + return { + status: 'ready', + services: { database: 'connected' }, + timestamp: new Date().toISOString(), + }; + } catch (error) { + throw new ServiceUnavailableException({ + status: 'not ready', + services: { database: 'disconnected' }, + timestamp: new Date().toISOString(), + error: error instanceof Error ? error.message : 'Unknown db error', + }); + } + } + + @ApiOperation({ summary: 'Test Sentry error capture (development only)' }) + @ApiResponse({ status: 500, description: 'Test error thrown for Sentry' }) + @Public() + @Get('sentry/debug') + sentryDebug() { + const isProduction = this.config.get('isProduction', false); + if (isProduction) { + return { error: 'Debug endpoint disabled in production' }; + } + // Test Sentry error capture + throw new Error('Test error for Sentry integration verification'); + } + + @ApiOperation({ summary: 'Test Sentry message capture (development only)' }) + @ApiResponse({ status: 200, description: 'Test message sent to Sentry' }) + @Public() + @Get('sentry/message') + sentryMessage() { + const isProduction = this.config.get('isProduction', false); + if (isProduction) { + return { error: 'Debug endpoint disabled in production' }; + } + Sentry.captureMessage('Test message from NestJS health endpoint', 'info'); + return { + status: 'Message sent to Sentry', + timestamp: new Date().toISOString(), + }; + } +} diff --git a/apps/backend/src/modules/health/health.module.ts b/apps/backend/src/modules/health/health.module.ts new file mode 100644 index 0000000..7476abe --- /dev/null +++ b/apps/backend/src/modules/health/health.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; +import { HealthController } from './health.controller'; + +@Module({ + controllers: [HealthController], +}) +export class HealthModule {} diff --git a/apps/backend/src/modules/mail/mail.module.ts b/apps/backend/src/modules/mail/mail.module.ts new file mode 100644 index 0000000..251288f --- /dev/null +++ b/apps/backend/src/modules/mail/mail.module.ts @@ -0,0 +1,10 @@ +import { Module, Global } from '@nestjs/common'; +import { MailService } from './mail.service'; +import { TemplateService } from './template.service'; + +@Global() +@Module({ + providers: [MailService, TemplateService], + exports: [MailService], +}) +export class MailModule {} diff --git a/apps/backend/src/modules/mail/mail.service.ts b/apps/backend/src/modules/mail/mail.service.ts new file mode 100644 index 0000000..c869ade --- /dev/null +++ b/apps/backend/src/modules/mail/mail.service.ts @@ -0,0 +1,124 @@ +import * as nodemailer from 'nodemailer'; +import { ConfigService } from '@nestjs/config'; +import { Injectable } from '@nestjs/common'; +import type { MailConfig } from '@/config/mail.config'; +import { PinoLogger } from 'nestjs-pino'; +import { TemplateService } from './template.service'; +import type { User } from '@/database/entities'; + +@Injectable() +export class MailService { + private transporter: nodemailer.Transporter; + private fromName: string; + private fromEmail: string; + private origin: string; + + constructor( + private readonly configService: ConfigService, + private readonly logger: PinoLogger, + private readonly templateService: TemplateService, + ) { + this.logger.setContext(MailService.name); + const mailConfig = this.configService.get('mail') as MailConfig; + this.fromName = mailConfig.from.name; + this.fromEmail = mailConfig.from.email; + this.origin = this.configService.get('origin') as string; + this.transporter = nodemailer.createTransport({ + host: mailConfig.host, + port: mailConfig.port, + secure: mailConfig.secure, + auth: mailConfig.auth.user ? mailConfig.auth : undefined, + }); + } + + async sendPasswordResetEmail(user: User, token: string): Promise { + await this.logger.info(`Sending password reset email to: ${user.email}`); + const resetUrl = + `${this.origin}/auth/reset-password?token=${encodeURIComponent(token)}`; + const variables = { + resetUrl, + title: 'Password Reset Request', + headerIcon: '๐Ÿ”', + headerTitle: 'Password Reset Request', + headerGradientStart: '#667eea', + headerGradientEnd: '#764ba2', + buttonColor: '#007bff', + firstName: user.firstName || 'User', + fromName: this.fromName, + footerNote: + 'This is an automated message. Please do not reply to this email.', + }; + + const html = await this.templateService.renderTemplate( + 'password-reset.html', + variables, + ); + const text = await this.templateService.renderTemplate( + 'password-reset', + variables, + ); + + const mailOptions = { + from: `"${this.fromName}" <${this.fromEmail}>`, + to: user.email, + subject: 'Password Reset Request', + html, + text, + }; + try { + await this.transporter.sendMail(mailOptions); + await this.logger.info(`Reset password email sent to: ${user.email}`); + } catch (err) { + await this.logger.error( + `Failed to send reset password email to: ${user.email}`, + err, + ); + } + } + + async sendInvitationEmail(user: User, token: string): Promise { + await this.logger.info(`Sending invitation email to: ${user.email}`); + const inviteUrl = + `${this.origin}/auth/reset-password?token=${encodeURIComponent(token)}`; + const variables = { + inviteUrl, + title: 'You\'re Invited!', + headerIcon: '๐ŸŽ‰', + headerTitle: 'Welcome!', + headerGradientStart: '#28a745', + headerGradientEnd: '#20c997', + buttonColor: '#28a745', + firstName: user.firstName || 'there', + fromName: this.fromName, + footerNote: + 'This invitation was sent to you by an administrator of our platform.', + }; + + const html = await this.templateService.renderTemplate( + 'invitation.html', + variables, + ); + const text = await this.templateService.renderTemplate( + 'invitation', + variables, + ); + + const mailOptions = { + from: `"${this.fromName}" <${this.fromEmail}>`, + to: user.email, + subject: 'You have been invited to join', + html, + text, + }; + + try { + await this.transporter.sendMail(mailOptions); + await this.logger.info(`Invitation email sent to: ${user.email}`); + } catch (error) { + await this.logger.error( + `Failed to send invitation email to: ${user.email}`, + error, + ); + } + } +} diff --git a/apps/backend/src/modules/mail/template.service.ts b/apps/backend/src/modules/mail/template.service.ts new file mode 100644 index 0000000..7cf6e0e --- /dev/null +++ b/apps/backend/src/modules/mail/template.service.ts @@ -0,0 +1,99 @@ +import * as Handlebars from 'handlebars'; +import { Injectable } from '@nestjs/common'; +import { PinoLogger } from 'nestjs-pino'; +import { join } from 'path'; +import { promises as fs } from 'fs'; + +interface TemplateVars { + [key: string]: any; +} + +@Injectable() +export class TemplateService { + private handlebars: typeof Handlebars; + private templateCache = new Map(); + + constructor(private readonly logger: PinoLogger) { + this.handlebars = Handlebars.create(); + this.logger.setContext(TemplateService.name); + } + + async renderTemplate(name: string, vars: TemplateVars): Promise { + if ( + !this.handlebars.partials || + Object.keys(this.handlebars.partials).length === 0 + ) { + await this.registerPartials(); + } + // Check if this is a layout-based template + if (name.includes('.html')) + return this.renderHTML(name.replace('.html', ''), vars); + // For text templates, render directly from content directory + const templatePath = `content/${name}.template.txt`; + const template = await this.getCompliedTemplate(templatePath); + return template(vars); + } + + private async renderHTML(name: string, vars: TemplateVars): Promise { + const templatePath = `content/${name}.template.html`; + const contentTemplate = await this.getCompliedTemplate(templatePath); + const content = contentTemplate(vars); + // Load the base layout and render with content + const layout = await this.getCompliedTemplate('layouts/base.template.html'); + const layoutVariables = { ...vars, content }; + return layout(layoutVariables); + } + + private async getCompliedTemplate( + name: string, + ): Promise { + if (this.templateCache.has(name)) return this.templateCache.get(name)!; + try { + const templateContent = await this.loadTemplateFile(name); + const compiledTemplate = this.handlebars.compile(templateContent); + this.templateCache.set(name, compiledTemplate); + this.logger.debug(`Template compiled and cached: ${name}`); + return compiledTemplate; + } catch (error) { + this.logger.error(`Failed to compile template ${name}:`, error); + throw new Error(`Failed to compile template ${name}: ${error.message}`); + } + } + + // Load template file from filesystem + private async loadTemplateFile(templateName: string): Promise { + // In dev: __dirname is src/modules/mail + // In prod: __dirname is dist/modules/mail (templates are copied there by + // nest-cli.json assets config) + const templatePath = join(__dirname, 'templates', templateName); + try { + const content = await fs.readFile(templatePath, 'utf-8'); + this.logger.debug(`Template loaded from: ${templatePath}`); + return content; + } catch { + throw new Error( + `Template file not found: ${templateName} at ${templatePath}. + Ensure nest-cli.json includes templates in assets.`, + ); + } + } + + // Register partials from the partials directory + private async registerPartials(): Promise { + const partialsDir = join(__dirname, 'templates', 'partials'); + try { + const files = await fs.readdir(partialsDir); + for (const file of files) { + if (file.endsWith('.template.html')) { + const partialName = file.replace('.template.html', ''); + const partialPath = join(partialsDir, file); + const partialContent = await fs.readFile(partialPath, 'utf-8'); + this.handlebars.registerPartial(partialName, partialContent); + this.logger.debug(`Registered partial: ${partialName}`); + } + } + } catch (error) { + this.logger.warn(`Could not load partials: ${error.message}`); + } + } +} diff --git a/apps/backend/src/modules/mail/templates/content/invitation.template.html b/apps/backend/src/modules/mail/templates/content/invitation.template.html new file mode 100644 index 0000000..369e9b8 --- /dev/null +++ b/apps/backend/src/modules/mail/templates/content/invitation.template.html @@ -0,0 +1,25 @@ +

Hello {{firstName}},

+ +

+ You have been invited to join our platform. We're excited to have you as part + of our community! +

+ +

Click the button below to set up your account and get started:

+ + + +

Or copy and paste this link in your browser:

+
{{inviteUrl}}
+ +
+ ๐Ÿ“… Note: This invitation link will expire in 7 days. Please + set up your account before then. +
+ +

+ If you have any questions or need assistance, feel free to reach out to our + support team. +

diff --git a/apps/backend/src/modules/mail/templates/content/invitation.template.txt b/apps/backend/src/modules/mail/templates/content/invitation.template.txt new file mode 100644 index 0000000..3fb662c --- /dev/null +++ b/apps/backend/src/modules/mail/templates/content/invitation.template.txt @@ -0,0 +1,20 @@ +Welcome! +======== + +Hello {{firstName}}, + +You have been invited to join our platform. We're excited to have you as part of our community! + +Click the link below to set up your account and get started: + +{{inviteUrl}} + +๐Ÿ“… Note: This invitation link will expire in 7 days. Please set up your account before then. + +If you have any questions or need assistance, feel free to reach out to our support team. + +Best regards, +{{fromName}} + +--- +This invitation was sent to you by an administrator of our platform. diff --git a/apps/backend/src/modules/mail/templates/content/password-reset.template.html b/apps/backend/src/modules/mail/templates/content/password-reset.template.html new file mode 100644 index 0000000..5da7633 --- /dev/null +++ b/apps/backend/src/modules/mail/templates/content/password-reset.template.html @@ -0,0 +1,29 @@ +

Hello {{firstName}},

+ +

+ You requested to reset your password. Click the button below to proceed with + resetting your password: +

+ + + +

Or copy and paste this link in your browser:

+
{{resetUrl}}
+ +
+ โฐ Important: This link will expire in 60 mins for security + reasons. +
+ +

+ If you didn't request this password reset, please ignore this email. Your + password will remain unchanged. +

+ +

For security reasons, we recommend:

+
    +
  • Using a strong, unique password
  • +
  • Not sharing your password with anyone
  • +
diff --git a/apps/backend/src/modules/mail/templates/content/password-reset.template.txt b/apps/backend/src/modules/mail/templates/content/password-reset.template.txt new file mode 100644 index 0000000..6a5ed32 --- /dev/null +++ b/apps/backend/src/modules/mail/templates/content/password-reset.template.txt @@ -0,0 +1,22 @@ +Password Reset Request +====================== + +Hello {{firstName}}, + +You requested to reset your password. Visit the link below to reset it: + +{{resetUrl}} + +โฐ Important: This link will expire in 2 hours for security reasons. + +If you didn't request this password reset, please ignore this email. Your password will remain unchanged. + +For security reasons, we recommend: +โ€ข Using a strong, unique password +โ€ข Not sharing your password with anyone + +Best regards, +{{fromName}} + +--- +This is an automated message. Please do not reply to this email. diff --git a/apps/backend/src/modules/mail/templates/layouts/base.template.html b/apps/backend/src/modules/mail/templates/layouts/base.template.html new file mode 100644 index 0000000..d280051 --- /dev/null +++ b/apps/backend/src/modules/mail/templates/layouts/base.template.html @@ -0,0 +1,16 @@ + + + + + + {{title}} + {{> styles}} + + +
+ {{> header}} +
{{{content}}}
+ {{> footer}} +
+ + diff --git a/apps/backend/src/modules/mail/templates/partials/footer.template.html b/apps/backend/src/modules/mail/templates/partials/footer.template.html new file mode 100644 index 0000000..3d0923b --- /dev/null +++ b/apps/backend/src/modules/mail/templates/partials/footer.template.html @@ -0,0 +1,12 @@ + diff --git a/apps/backend/src/modules/mail/templates/partials/header.template.html b/apps/backend/src/modules/mail/templates/partials/header.template.html new file mode 100644 index 0000000..5ddae16 --- /dev/null +++ b/apps/backend/src/modules/mail/templates/partials/header.template.html @@ -0,0 +1,6 @@ +
+

{{headerIcon}} {{headerTitle}}

+ {{#if headerSubtitle}} +

{{headerSubtitle}}

+ {{/if}} +
diff --git a/apps/backend/src/modules/mail/templates/partials/styles.template.html b/apps/backend/src/modules/mail/templates/partials/styles.template.html new file mode 100644 index 0000000..664e3a9 --- /dev/null +++ b/apps/backend/src/modules/mail/templates/partials/styles.template.html @@ -0,0 +1,112 @@ + diff --git a/apps/backend/src/modules/seed/dto/index.ts b/apps/backend/src/modules/seed/dto/index.ts new file mode 100644 index 0000000..b083f2d --- /dev/null +++ b/apps/backend/src/modules/seed/dto/index.ts @@ -0,0 +1 @@ +export * from './seed.dto'; diff --git a/apps/backend/src/modules/seed/dto/seed.dto.ts b/apps/backend/src/modules/seed/dto/seed.dto.ts new file mode 100644 index 0000000..35b324e --- /dev/null +++ b/apps/backend/src/modules/seed/dto/seed.dto.ts @@ -0,0 +1,9 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class SeedResponseDto { + @ApiProperty({ description: 'Result message' }) + message: string; + + @ApiPropertyOptional({ description: 'Response data' }) + data?: any; +} diff --git a/apps/backend/src/modules/seed/guards/environment.guard.ts b/apps/backend/src/modules/seed/guards/environment.guard.ts new file mode 100644 index 0000000..c8f985c --- /dev/null +++ b/apps/backend/src/modules/seed/guards/environment.guard.ts @@ -0,0 +1,14 @@ +import type { CanActivate, ExecutionContext } from '@nestjs/common'; +import { Injectable, ForbiddenException } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class EnvironmentGuard implements CanActivate { + constructor(private readonly configService: ConfigService) {} + + canActivate(_ctx: ExecutionContext): boolean { + const isProduction = this.configService.get('isProduction', false); + if (!isProduction) return true; + throw new ForbiddenException('Seed endpoints are not available in prod'); + } +} diff --git a/apps/backend/src/modules/seed/guards/index.ts b/apps/backend/src/modules/seed/guards/index.ts new file mode 100644 index 0000000..cfe693e --- /dev/null +++ b/apps/backend/src/modules/seed/guards/index.ts @@ -0,0 +1 @@ +export * from './environment.guard'; diff --git a/apps/backend/src/modules/seed/seed.controller.ts b/apps/backend/src/modules/seed/seed.controller.ts new file mode 100644 index 0000000..94151d1 --- /dev/null +++ b/apps/backend/src/modules/seed/seed.controller.ts @@ -0,0 +1,58 @@ +import { + Controller, + HttpCode, + HttpStatus, + Post, + UseGuards, +} from '@nestjs/common'; +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { EnvironmentGuard } from './guards'; +import { Public } from '@/modules/auth/decorators'; +import { SeedResponseDto } from './dto'; +import { SeedService } from './seed.service'; + +@ApiTags('seed') +@Controller('seed') +@UseGuards(EnvironmentGuard) +@Public() +export class SeedController { + constructor(private readonly seedService: SeedService) {} + + @ApiOperation({ + summary: 'Reset database with base seed data', + description: + 'Clears all data and reseeds with base admin user. Only in non prod env.', + }) + @ApiResponse({ + status: 200, + description: 'Database reset successfully', + type: SeedResponseDto, + }) + @ApiResponse({ + status: 403, + description: 'Forbidden - not available in production', + }) + @Post('reset') + @HttpCode(HttpStatus.OK) + async resetDatabase(): Promise { + await this.seedService.resetDatabase(); + return { + message: 'Database reset successfully', + }; + } + + @ApiOperation({ + summary: 'Create a single test user', + description: 'Creates a test user with random data', + }) + @ApiResponse({ + status: 201, + description: 'Test user created successfully', + type: SeedResponseDto, + }) + @Post('user') + async seedUser(): Promise { + const data = await this.seedService.createTestUser(); + return data.toJSON(); + } +} diff --git a/apps/backend/src/modules/seed/seed.module.ts b/apps/backend/src/modules/seed/seed.module.ts new file mode 100644 index 0000000..a9ee095 --- /dev/null +++ b/apps/backend/src/modules/seed/seed.module.ts @@ -0,0 +1,15 @@ +import { Module } from '@nestjs/common'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { User } from '@/database/entities'; +import { UserModule } from '@/modules/user/user.module'; +import { SeedController } from './seed.controller'; +import { SeedService } from './seed.service'; +import { EnvironmentGuard } from './guards'; + +@Module({ + imports: [MikroOrmModule.forFeature([User]), UserModule], + controllers: [SeedController], + providers: [SeedService, EnvironmentGuard], + exports: [SeedService], +}) +export class SeedModule {} diff --git a/apps/backend/src/modules/seed/seed.service.ts b/apps/backend/src/modules/seed/seed.service.ts new file mode 100644 index 0000000..ac5cc63 --- /dev/null +++ b/apps/backend/src/modules/seed/seed.service.ts @@ -0,0 +1,40 @@ +import { User, UserRole } from '@/database/entities'; +import { EntityManager } from '@mikro-orm/core'; +import { DatabaseSeeder } from '@/database/seeders/DatabaseSeeder'; +import { Injectable } from '@nestjs/common'; +import { PinoLogger } from 'nestjs-pino'; +import { UserService } from '@/modules/user/user.service'; +import casual from 'casual'; + +@Injectable() +export class SeedService { + constructor( + private readonly em: EntityManager, + private readonly logger: PinoLogger, + private readonly userService: UserService, + ) { + this.logger.setContext(SeedService.name); + } + + async resetDatabase(): Promise { + this.logger.debug('Resetting database for tests'); + const em = this.em.fork(); + await em.nativeDelete(User, {}); + const seeder = new DatabaseSeeder(); + await seeder.run(em); + this.logger.debug('Database reset completed'); + } + + async createTestUser(): Promise { + this.logger.debug('Creating test user'); + const userData = { + email: casual.email.toLowerCase(), + firstName: casual.first_name, + lastName: casual.last_name, + role: UserRole.USER, + }; + const user = await this.userService.create(userData); + this.logger.debug(`Test user created: ${user.email}`); + return user; + } +} diff --git a/apps/backend/src/modules/user/dto/create-user.dto.ts b/apps/backend/src/modules/user/dto/create-user.dto.ts new file mode 100644 index 0000000..fc1b49c --- /dev/null +++ b/apps/backend/src/modules/user/dto/create-user.dto.ts @@ -0,0 +1,69 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { + IsEmail, + IsNotEmpty, + IsString, + MinLength, + MaxLength, + IsOptional, + IsEnum, +} from 'class-validator'; +import { NoXSS } from '@/common/validators/no-xss.validator'; +import { Transform } from 'class-transformer'; +import { UserRole } from '@/database/entities'; + +export class CreateUserDto { + @ApiProperty({ + description: 'User email address', + example: 'user@example.com', + }) + @IsNotEmpty() + @IsString({ message: 'Email must be a string' }) + @IsEmail() + @Transform(({ value }) => { + if (typeof value !== 'string') return value; + return value.toLowerCase().trim(); + }) + email: string; + + @ApiPropertyOptional({ + description: 'User first name', + example: 'John', + }) + @IsOptional() + @IsString({ message: 'First name must be a string' }) + @MinLength(0) + @MaxLength(50) + @NoXSS() + @Transform(({ value }) => { + if (value === null || value === undefined) return value; + if (typeof value !== 'string') return value; + return value.trim(); + }) + firstName?: string; + + @ApiPropertyOptional({ + description: 'User last name', + example: 'Doe', + }) + @IsOptional() + @IsString({ message: 'Last name must be a string' }) + @MinLength(0) + @MaxLength(50) + @NoXSS() + @Transform(({ value }) => { + if (value === null || value === undefined) return value; + if (typeof value !== 'string') return value; + return value.trim(); + }) + lastName?: string; + + @ApiPropertyOptional({ + description: 'User role', + enum: UserRole, + example: UserRole.USER, + }) + @IsOptional() + @IsEnum(UserRole) + role?: UserRole; +} diff --git a/apps/backend/src/modules/user/dto/index.ts b/apps/backend/src/modules/user/dto/index.ts new file mode 100644 index 0000000..8b5fcbf --- /dev/null +++ b/apps/backend/src/modules/user/dto/index.ts @@ -0,0 +1,4 @@ +export * from './create-user.dto'; +export * from './update-user.dto'; +export * from './query-user.dto'; +export * from './user-response.dto'; diff --git a/apps/backend/src/modules/user/dto/query-user.dto.ts b/apps/backend/src/modules/user/dto/query-user.dto.ts new file mode 100644 index 0000000..faddee4 --- /dev/null +++ b/apps/backend/src/modules/user/dto/query-user.dto.ts @@ -0,0 +1,98 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { + IsOptional, + IsString, + IsEnum, + IsInt, + Min, + Max, + IsBoolean, + IsEmail, +} from 'class-validator'; +import { Transform, Type } from 'class-transformer'; + +export enum UserSortField { + ID = 'id', + EMAIL = 'email', + FIRST_NAME = 'firstName', + LAST_NAME = 'lastName', + CREATED_AT = 'createdAt', + UPDATED_AT = 'updatedAt', +} + +export enum SortOrder { + ASC = 'ASC', + DESC = 'DESC', +} + +export class QueryUserDto { + @ApiPropertyOptional({ + description: 'Find by exact email', + example: 'admin@example.com', + }) + @IsOptional() + @IsEmail() + @Transform(({ value }) => value?.toLowerCase().trim()) + email?: string; + + @ApiPropertyOptional({ + description: 'Search term for email, first name, or last name', + example: 'john', + }) + @IsString() + @IsOptional() + @Transform(({ value }) => value?.trim()) + search?: string; + + @ApiPropertyOptional({ + description: 'Include soft-deleted users', + example: false, + default: false, + }) + @IsBoolean() + @IsOptional() + @Transform(({ value }) => value === 'true' || value === true) + includeArchived?: boolean; + + @ApiPropertyOptional({ + description: 'Page number', + minimum: 1, + default: 1, + }) + @IsInt() + @Type(() => Number) + @Min(1) + @IsOptional() + page?: number = 1; + + @ApiPropertyOptional({ + description: 'Number of items per page', + minimum: 1, + maximum: 100, + default: 20, + }) + @Type(() => Number) + @IsInt() + @Min(1) + @Max(100) + @IsOptional() + limit?: number = 20; + + @ApiPropertyOptional({ + description: 'Field to sort by', + enum: UserSortField, + default: UserSortField.CREATED_AT, + }) + @IsEnum(UserSortField) + @IsOptional() + sortBy?: UserSortField = UserSortField.CREATED_AT; + + @ApiPropertyOptional({ + description: 'Sort order', + default: SortOrder.DESC, + enum: SortOrder, + }) + @IsEnum(SortOrder) + @IsOptional() + sortOrder?: SortOrder = SortOrder.DESC; +} diff --git a/apps/backend/src/modules/user/dto/update-user.dto.ts b/apps/backend/src/modules/user/dto/update-user.dto.ts new file mode 100644 index 0000000..b2b24d1 --- /dev/null +++ b/apps/backend/src/modules/user/dto/update-user.dto.ts @@ -0,0 +1,71 @@ +import { ApiPropertyOptional, OmitType } from '@nestjs/swagger'; +import { + IsOptional, + IsString, + MinLength, + MaxLength, + IsEnum, + IsEmail, +} from 'class-validator'; +import { IsDataUrl } from '@/common/validators/data-url.validator'; +import { NoXSS } from '@/common/validators/no-xss.validator'; +import { Transform } from 'class-transformer'; +import { UserRole } from '@/database/entities'; + +export class UpdateUserDto { + @ApiPropertyOptional({ + description: 'User email address', + example: 'user@example.com', + }) + @IsEmail() + @IsOptional() + @Transform(({ value }) => value?.toLowerCase().trim()) + email?: string; + + @ApiPropertyOptional({ + description: 'User first name', + example: 'John', + }) + @IsOptional() + @IsString({ message: 'First name must be a string' }) + @MinLength(2) + @MaxLength(50) + @NoXSS() + @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value)) + firstName?: string; + + @ApiPropertyOptional({ + description: 'User last name', + example: 'Doe', + }) + @IsOptional() + @IsString({ message: 'Last name must be a string' }) + @MinLength(2) + @MaxLength(50) + @NoXSS() + @Transform(({ value }) => (typeof value === 'string' ? value.trim() : value)) + lastName?: string; + + @ApiPropertyOptional({ + description: 'User avatar as data URL (base64 encoded image)', + example: + // eslint-disable-next-line max-len + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=', + }) + @IsDataUrl() + @IsOptional() + imgUrl?: string; + + @ApiPropertyOptional({ + description: 'User role (admin only)', + enum: UserRole, + example: UserRole.USER, + }) + @IsEnum(UserRole) + @IsOptional() + role?: UserRole; +} + +export class UpdateProfileDto extends OmitType(UpdateUserDto, [ + 'role', +] as const) {} diff --git a/apps/backend/src/modules/user/dto/user-response.dto.ts b/apps/backend/src/modules/user/dto/user-response.dto.ts new file mode 100644 index 0000000..57cdeba --- /dev/null +++ b/apps/backend/src/modules/user/dto/user-response.dto.ts @@ -0,0 +1,74 @@ +import { Exclude, Expose, Type } from 'class-transformer'; +import { ApiProperty } from '@nestjs/swagger'; +import { UserRole } from '@/database/entities'; + +@Exclude() +export class UserDto { + @Expose() + @ApiProperty() + id: number; + + @Expose() + @ApiProperty() + email: string; + + @Expose() + @ApiProperty({ enum: UserRole }) + role: UserRole; + + @Expose() + @ApiProperty() + firstName?: string; + + @Expose() + @ApiProperty() + lastName?: string; + + @Expose() + @ApiProperty() + fullName?: string; + + @Expose() + @ApiProperty() + label?: string; + + @Expose() + @ApiProperty() + imgUrl?: string; + + @Expose() + @ApiProperty() + createdAt: Date; + + @Expose() + @ApiProperty() + updatedAt: Date; + + @Expose() + @ApiProperty() + deletedAt?: Date; +} + +export class PaginatedUsersDto { + @ApiProperty({ type: [UserDto] }) + @Type(() => UserDto) + data: UserDto[]; + + @ApiProperty({ description: 'Total number of items', example: 100 }) + total: number; + + @ApiProperty({ description: 'Number of items per page', example: 20 }) + limit: number; + + @ApiProperty({ description: 'Current page number', example: 1 }) + page: number; + + @ApiProperty({ description: 'Total number of pages', example: 5 }) + totalPages: number; + + @ApiProperty({ description: 'Has previous page', example: false }) + hasPrevious: boolean; + + @ApiProperty({ description: 'Has next page', example: true }) + hasNext: boolean; +} diff --git a/apps/backend/src/modules/user/me.controller.ts b/apps/backend/src/modules/user/me.controller.ts new file mode 100644 index 0000000..9205b61 --- /dev/null +++ b/apps/backend/src/modules/user/me.controller.ts @@ -0,0 +1,41 @@ +import { Controller, Body, Get, Patch } from '@nestjs/common'; +import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { UpdateProfileDto, UserDto } from './dto'; +import { CurrentUser } from '@/modules/auth/decorators/current-user.decorator'; +import { UserService } from './user.service'; +import { User } from '@/database/entities'; + +@ApiTags('me') +@Controller('me') +export class CurrentUserController { + constructor(private readonly userService: UserService) {} + + @ApiOperation({ summary: 'Get current user profile' }) + @ApiResponse({ + status: 200, + description: 'Current user profile', + type: UserDto, + }) + @Get() + async get(@CurrentUser() user: any): Promise<{ user: User }> { + return user; + } + + @ApiOperation({ summary: 'Update user profile' }) + @ApiResponse({ + status: 200, + description: 'Updated user profile', + type: UserDto, + }) + @Patch() + async update( + @CurrentUser() user: any, + @Body() updateProfileDto: UpdateProfileDto, + ): Promise { + const updatedUser = await this.userService.update( + user.id, + updateProfileDto, + ); + return updatedUser.toJSON(); + } +} diff --git a/apps/backend/src/modules/user/user.controller.ts b/apps/backend/src/modules/user/user.controller.ts new file mode 100644 index 0000000..b13e46f --- /dev/null +++ b/apps/backend/src/modules/user/user.controller.ts @@ -0,0 +1,126 @@ +import { ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { + Body, + Controller, + Delete, + Get, + HttpCode, + HttpStatus, + Param, + Patch, + Post, + Query, +} from '@nestjs/common'; +import { + CreateUserDto, + UpdateUserDto, + QueryUserDto, + UserDto, + PaginatedUsersDto, +} from './dto'; +import { CurrentUser } from '@/modules/auth/decorators/current-user.decorator'; +import { User, UserRole } from '@/database/entities'; +import { UserService } from './user.service'; +import { Roles } from '@/modules/auth/decorators'; + +@ApiTags('users') +@Controller('users') +export class UserController { + constructor(private readonly userService: UserService) {} + + @Get() + @Roles(UserRole.ADMIN, UserRole.USER) + @ApiOperation({ summary: 'List users' }) + @ApiResponse({ + description: 'List of users', + status: 200, + type: PaginatedUsersDto, + }) + async fetch(@Query() queryDto: QueryUserDto) { + return this.userService.findAll(queryDto); + } + + @Post() + @Roles(UserRole.ADMIN) + @ApiOperation({ summary: 'Create or invite user (Admin only)' }) + @ApiResponse({ + description: 'User created successfully', + status: 201, + type: UserDto, + }) + @ApiResponse({ status: 409, description: 'User already exists' }) + async create(@Body() createUserDto: CreateUserDto) { + const user = await this.userService.create(createUserDto); + return user.toJSON(); + } + + @Get(':id') + @Roles(UserRole.ADMIN) + @ApiOperation({ summary: 'Get user by ID (Admin only)' }) + @ApiParam({ name: 'id', description: 'User ID' }) + @ApiResponse({ status: 200, description: 'User found', type: UserDto }) + @ApiResponse({ status: 404, description: 'User not found' }) + async get(@Param('id') id: string): Promise { + return this.userService.get(id); + } + + @Patch(':id') + @Roles(UserRole.ADMIN) + @ApiOperation({ summary: 'Update user by ID' }) + @ApiParam({ name: 'id', description: 'User ID' }) + @ApiResponse({ + description: 'User updated successfully', + status: 200, + type: UserDto, + }) + @ApiResponse({ status: 404, description: 'User not found' }) + @ApiResponse({ status: 403, description: 'Forbidden' }) + async update( + @Param('id') id: string, + @Body() updateUserDto: UpdateUserDto, + @CurrentUser() currentUser: any, + ): Promise { + const user = await this.userService.update(id, updateUserDto, currentUser); + return user.toJSON() as User; + } + + @Delete(':id') + @Roles(UserRole.ADMIN) + @HttpCode(HttpStatus.NO_CONTENT) + @ApiOperation({ summary: 'Delete user (Admin only)' }) + @ApiParam({ name: 'id', description: 'User ID' }) + @ApiResponse({ status: 204, description: 'User deleted successfully' }) + @ApiResponse({ status: 404, description: 'User not found' }) + async remove( + @Param('id') id: string, + @CurrentUser() currentUser: any, + ): Promise { + return this.userService.remove(id, currentUser); + } + + @Post(':id/restore') + @Roles(UserRole.ADMIN) + @HttpCode(HttpStatus.OK) + @ApiOperation({ summary: 'Restore soft-deleted user (Admin only)' }) + @ApiParam({ name: 'id', description: 'User ID' }) + @ApiResponse({ + status: 200, + description: 'User restored successfully', + type: UserDto, + }) + @ApiResponse({ status: 404, description: 'User not found' }) + async restore(@Param('id') id: string): Promise { + return this.userService.restore(id); + } + + @Post(':id/reinvite') + @Roles(UserRole.ADMIN) + @HttpCode(HttpStatus.ACCEPTED) + @ApiOperation({ summary: 'Reinvite user (Admin only)' }) + @ApiParam({ name: 'id', description: 'User ID' }) + @ApiResponse({ status: 202, description: 'Invitation sent' }) + @ApiResponse({ status: 404, description: 'User not found' }) + async reinvite(@Param('id') id: string): Promise { + await this.userService.reinvite(id); + } +} diff --git a/apps/backend/src/modules/user/user.module.ts b/apps/backend/src/modules/user/user.module.ts new file mode 100644 index 0000000..a3b59e7 --- /dev/null +++ b/apps/backend/src/modules/user/user.module.ts @@ -0,0 +1,18 @@ +import { Module, forwardRef } from '@nestjs/common'; +import { AuthModule } from '../auth/auth.module'; +import { CurrentUserController } from './me.controller'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { User } from '@/database/entities'; +import { UserController } from './user.controller'; +import { UserService } from './user.service'; + +@Module({ + imports: [ + forwardRef(() => AuthModule), + MikroOrmModule.forFeature([User]), + ], + controllers: [CurrentUserController, UserController], + providers: [UserService], + exports: [UserService, MikroOrmModule], +}) +export class UserModule {} diff --git a/apps/backend/src/modules/user/user.repository.ts b/apps/backend/src/modules/user/user.repository.ts new file mode 100644 index 0000000..ac11ad9 --- /dev/null +++ b/apps/backend/src/modules/user/user.repository.ts @@ -0,0 +1,12 @@ +import { EntityRepository } from '@mikro-orm/core'; +import type { User } from '@/database/entities'; + +export class UserRepository extends EntityRepository { + async get(id: string): Promise { + return this.findOne(id, { filters: false }); + } + + async findByEmail(email: string): Promise { + return this.findOne({ email: email.toLowerCase() }, { filters: false }); + } +} diff --git a/apps/backend/src/modules/user/user.service.ts b/apps/backend/src/modules/user/user.service.ts new file mode 100644 index 0000000..ca353e3 --- /dev/null +++ b/apps/backend/src/modules/user/user.service.ts @@ -0,0 +1,219 @@ +import { + BadRequestException, + ConflictException, + Injectable, + NotFoundException, +} from '@nestjs/common'; +import type { + CreateUserDto, + UpdateUserDto, + QueryUserDto, + PaginatedUsersDto, +} from './dto'; +import { EntityManager, QueryOrder } from '@mikro-orm/core'; +import { User, UserRole } from '@/database/entities'; +import { UserSortField, SortOrder } from './dto'; + +import { AuthService } from '@/modules/auth/auth.service'; +import type { FilterQuery } from '@mikro-orm/core'; +import { InjectRepository } from '@mikro-orm/nestjs'; +import { PinoLogger } from 'nestjs-pino'; +import { UserRepository } from './user.repository'; +import { randomBytes } from 'node:crypto'; + +@Injectable() +export class UserService { + constructor( + @InjectRepository(User) + private readonly userRepository: UserRepository, + private readonly em: EntityManager, + private readonly logger: PinoLogger, + private readonly authService: AuthService, + ) { + this.logger.setContext(UserService.name); + } + + async get(id: string): Promise { + this.logger.debug(`Fetching user with id: ${id}`); + const user = await this.userRepository.get(id); + if (!user) { + this.logger.debug(`User with id ${id} not found`); + throw new NotFoundException(`User with id ${id} not found`); + } + this.logger.debug(`User found: ${user.email}`); + return user; + } + + async create(payload: CreateUserDto): Promise { + this.logger.debug(`Creating user with email: ${payload.email}`); + const existingUser = await this.userRepository.findByEmail(payload.email); + if (existingUser) { + const msgSuffix = existingUser.isDeleted + ? ' was previously used and is currently inactivated.' + : ' already exists'; + this.logger.debug(`User creation error: ${payload.email} ${msgSuffix}`); + throw new ConflictException( + existingUser.isDeleted + ? `Email ${msgSuffix}. Please restore the user instead.` + : `User with this email ${msgSuffix}`, + ); + } + const user = this.userRepository.create({ + ...payload, + email: payload.email.toLowerCase(), + password: randomBytes(20).toString('hex'), + role: payload.role || UserRole.USER, + } as any); + await this.em.persistAndFlush(user); + this.logger.debug(`User created with email: ${payload.email}`); + await this.authService.sendInvitationEmail(user); + return user; + } + + async findAll(query: QueryUserDto): Promise { + this.logger.debug('Fetching users with query:', query); + const { + search, + includeArchived, + page = 1, + limit = 20, + sortBy = UserSortField.CREATED_AT, + sortOrder = SortOrder.DESC, + } = query; + const where: FilterQuery = {}; + + if (search) { + // Check if we're using PostgreSQL (supports $ilike) or SQLite ($like) + const driverName = this.em.getDriver().constructor.name; + const isPostgres = driverName === 'PostgreSqlDriver'; + const likeOperator = isPostgres ? '$ilike' : '$like'; + where.$or = [ + { email: { [likeOperator]: `%${search}%` } }, + { firstName: { [likeOperator]: `%${search}%` } }, + { lastName: { [likeOperator]: `%${search}%` } }, + ]; + } + if (query.email) where.email = query.email; + if (!includeArchived) where.deletedAt = null; + const sortFieldMap: Record = { + [UserSortField.ID]: 'id', + [UserSortField.EMAIL]: 'email', + [UserSortField.FIRST_NAME]: 'firstName', + [UserSortField.LAST_NAME]: 'lastName', + [UserSortField.CREATED_AT]: 'createdAt', + [UserSortField.UPDATED_AT]: 'updatedAt', + }; + const orderBy = { + [sortFieldMap[sortBy]]: + sortOrder === SortOrder.ASC ? QueryOrder.ASC : QueryOrder.DESC, + }; + this.logger.debug('Constructed where clause:', where); + const [users, total] = await this.userRepository.findAndCount(where, { + filters: includeArchived ? false : undefined, + offset: (page - 1) * limit, + limit, + orderBy, + }); + const totalPages = Math.ceil(total / limit); + this.logger.debug(`Fetched ${users.length} users`); + return { + data: users.map((user) => user.toJSON()), + total, + page, + limit, + totalPages, + hasNext: page < totalPages, + hasPrevious: page > 1, + }; + } + + async update( + id: string, + payload: UpdateUserDto, + currentUser?: any, + ): Promise { + this.logger.debug(`Updating user with id: ${id}`); + const user = await this.get(id); + this.logger.debug(`User found for update: ${user.email}`); + // Check if trying to demote the last admin, self-demotion handled below + if (payload.role === UserRole.USER && user.role === UserRole.ADMIN) { + const adminCount = await this.userRepository.count({ + role: UserRole.ADMIN, + deletedAt: null, + }); + if (adminCount <= 1) { + this.logger.debug('Attempted to demote the last admin'); + throw new BadRequestException('Cannot demote the last admin'); + } + } + // Check if admin is trying to demote themselves + if ( + currentUser && + currentUser.id === id && + payload.role === UserRole.USER + ) { + this.logger.debug('Admin attempted to demote themselves'); + throw new BadRequestException('Cannot demote your own admin account'); + } + if (payload.email && payload.email !== user.email) { + this.logger.debug('Attempting to change email to:', payload.email); + this.logger.debug('Checking for existing user with new email'); + const existingUser = await this.userRepository.findByEmail(payload.email); + if (existingUser) throw new ConflictException('Email is already in use'); + } + Object.assign(user, payload); + await this.em.flush(); + this.logger.debug(`User ${id} updated`); + await this.em.refresh(user); + return user; + } + + async remove(id: string, currentUser?: any): Promise { + this.logger.debug(`Archiving user with id: ${id}`); + const user = await this.get(id); + + // Check if trying to delete the last admin + if (user.role === UserRole.ADMIN) { + const adminCount = await this.userRepository.count({ + role: UserRole.ADMIN, + deletedAt: null, + }); + if (adminCount <= 1) { + this.logger.debug('Attempted to delete the last admin'); + throw new BadRequestException('Cannot delete the last admin'); + } + } + + // Check if admin is trying to delete themselves + if (currentUser && currentUser.id === id) { + this.logger.debug('Admin attempted to delete themselves'); + throw new BadRequestException('Cannot delete your own admin account'); + } + + user.deletedAt = new Date(); + this.logger.debug(`User: ${user.email} has been archived`); + await this.em.flush(); + } + + async restore(id: string): Promise { + this.logger.debug(`Restoring user with id: ${id}`); + const user = await this.get(id); + this.logger.debug(`User found for restoration: ${user.email}`); + if (!user.isDeleted) throw new BadRequestException('User is not archived'); + user.deletedAt = undefined; + await this.em.flush(); + this.logger.debug(`User: ${user.email} has been restored`); + return user; + } + + async reinvite(id: string): Promise { + this.logger.debug(`Reinviting user with id: ${id}`); + const user = await this.get(id); + this.logger.debug('User found for reinvitation:', user.email); + try { + await this.authService.sendInvitationEmail(user); + } catch { + throw new BadRequestException('Failed to send invitation email'); + } + } +} diff --git a/apps/backend/src/utils/openapi.ts b/apps/backend/src/utils/openapi.ts new file mode 100644 index 0000000..caea715 --- /dev/null +++ b/apps/backend/src/utils/openapi.ts @@ -0,0 +1,36 @@ +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { INestApplication } from '@nestjs/common'; +import { join } from 'node:path'; +import { writeFileSync } from 'node:fs'; + +export function generateOpenApiDocument(app: INestApplication) { + const apiDocConfig = new DocumentBuilder() + .setTitle('API') + .setDescription('API documentation') + .setVersion('1.0') + .addBearerAuth() + .addTag('auth', 'Authentication endpoints') + .addTag('me', 'Current user profile endpoints') + .addTag('users', 'User management endpoints') + .addTag('health', 'Health check endpoints') + .build(); + + const document = SwaggerModule.createDocument(app, apiDocConfig, { + operationIdFactory: (ctrl: string, method: string) => { + return `${ctrl.replaceAll('Controller', '')}_${method}`; + }, + }); + return document; +} + +export function saveOpenApiSpec(document: any) { + const openApiPath = join(process.cwd(), 'openapi.json'); + try { + writeFileSync(openApiPath, JSON.stringify(document, null, 2)); + console.log(`๐Ÿ“„ OpenAPI spec saved to: ${openApiPath}`); + return true; + } catch (error) { + console.warn(`โš ๏ธ Could not save OpenAPI spec to file:`, error.message); + return false; + } +} diff --git a/apps/backend/test.env.example b/apps/backend/test.env.example new file mode 100644 index 0000000..fd60cd9 --- /dev/null +++ b/apps/backend/test.env.example @@ -0,0 +1,21 @@ +# Test Environment Variables +NODE_ENV=test +PORT=3001 +LOG_LEVEL=error +CORS_ALLOWED_ORIGINS=http://localhost:3000 + +# Database - using in-memory SQLite for tests +DATABASE_HOST=localhost +DATABASE_PORT=5432 +DATABASE_NAME=:memory: +DATABASE_USERNAME=test +DATABASE_PASSWORD=test +DATABASE_SSL=false +DATABASE_LOGGING=false + +# Auth +AUTH_SALT_ROUNDS=10 +AUTH_JWT_ISSUER=test-app +AUTH_JWT_SECRET=test-jwt-secret +AUTH_JWT_EXPIRES_IN=7d +AUTH_COOKIE_NAME=access_token diff --git a/apps/backend/test/README.md b/apps/backend/test/README.md new file mode 100644 index 0000000..4db1ea6 --- /dev/null +++ b/apps/backend/test/README.md @@ -0,0 +1,422 @@ +# Backend Testing Documentation + +A comprehensive end-to-end testing suite for the backend API, focusing on +security, authentication, authorization, and data integrity. + +## ๐Ÿงช Testing Philosophy + +Our testing approach prioritizes: +- **Security First**: Comprehensive security testing including XSS, SQL + injection, and access control +- **Real-World Scenarios**: End-to-end tests that simulate actual user workflows +- **Test Isolation**: Each test runs in a clean environment with fresh data +- **Developer Experience**: Rich helper utilities and clear test patterns + +## ๐Ÿš€ Quick Start + +### Setup Test Environment +```bash +# Copy test environment configuration +cp test.env.example .env.test + +# Install dependencies (from backend root) +pnpm install +``` + +### Running Tests +```bash +# Run all E2E tests +pnpm test:e2e + +# Run with coverage report +pnpm test:e2e:cov + +# Run in watch mode for development +pnpm test:e2e:watch + +# Run specific test file +pnpm test:e2e -- --testNamePattern="auth.login" + +# Run with verbose output +pnpm test:e2e -- --verbose +``` + +## ๐Ÿ“Š Test Coverage Overview + +### ๐Ÿ” Authentication & Security (95%+ Coverage) +- **Login/Logout Flows**: Credential validation, session management, security headers +- **Password Management**: Change password, forgot/reset flows, token validation +- **Token Security**: JWT validation, expiration, audience checking, secure cookies +- **Security Hardening**: XSS prevention, SQL injection protection, rate limiting + +### ๐Ÿ‘ฅ User Management (100% Coverage) +- **CRUD Operations**: Create, read, update, delete with proper authorization +- **Access Control**: Role-based permissions, self-modification prevention +- **Data Protection**: Sensitive field filtering, input validation, data integrity +- **Search & Filtering**: Text search, sorting, pagination, archived user handling + +### ๐Ÿ›ก๏ธ Authorization & Access Control (100% Coverage) +- **Role-Based Access**: Admin vs User permissions across all endpoints +- **Self-Protection**: Prevent users from escalating privileges or deleting themselves +- **Last Admin Protection**: Prevent deletion/demotion of the last admin user +- **Cross-User Protection**: Prevent users from accessing other users' data + +### โœ… Input Validation & Data Integrity (100% Coverage) +- **Type Safety**: Reject invalid data types, arrays where strings expected +- **Format Validation**: Email formats, UUID validation, string length limits +- **Edge Cases**: Unicode characters, special characters, null/undefined handling +- **Security Validation**: XSS payload rejection, SQL injection prevention + +## ๐Ÿ—๏ธ Test Architecture + +### Directory Structure +``` +test/ +โ”œโ”€โ”€ esm-shims/ # CommonJS compatibility for ESM packages +โ”‚ โ”œโ”€โ”€ app-config.js # Mock for @app/config package +โ”‚ โ”œโ”€โ”€ yn.js # CommonJS wrapper for yn package +โ”‚ โ””โ”€โ”€ README.md # Documentation for shims +โ”œโ”€โ”€ helpers/ # Test utilities and shared functions +โ”‚ โ”œโ”€โ”€ api-request.ts # HTTP client for API testing +โ”‚ โ”œโ”€โ”€ auth-client.ts # Specialized authentication client +โ”‚ โ”œโ”€โ”€ assertions.ts # Custom assertion helpers +โ”‚ โ”œโ”€โ”€ auth.spec.helpers.ts # JWT token generation utilities +โ”‚ โ”œโ”€โ”€ bootstrap.ts # Test app creation and teardown +โ”‚ โ”œโ”€โ”€ cookie.ts # Cookie parsing and validation +โ”‚ โ”œโ”€โ”€ db.helpers.ts # Database seeding and cleanup +โ”‚ โ”œโ”€โ”€ factories.ts # Test data factories +โ”‚ โ”œโ”€โ”€ routes.ts # API route constants +โ”‚ โ”œโ”€โ”€ test.helpers.ts # Main helper exports +โ”‚ โ””โ”€โ”€ index.ts # Helper module exports +โ”œโ”€โ”€ specs/ # Test specifications organized by feature +โ”‚ โ”œโ”€โ”€ auth/ # Authentication testing +โ”‚ โ”œโ”€โ”€ me/ # Current user profile testing +โ”‚ โ””โ”€โ”€ user/ # User management testing +โ”œโ”€โ”€ global-setup.ts # Global test environment setup +โ”œโ”€โ”€ global-teardown.ts # Global test cleanup +โ”œโ”€โ”€ jest-e2e.json # Jest configuration for E2E tests +โ”œโ”€โ”€ mikro-orm.config.ts # Test database configuration +โ””โ”€โ”€ test-app.module.ts # NestJS test application module +``` + +## ๐Ÿ› ๏ธ Helper Utilities + +### Core Testing Helpers + +#### `ApiRequest` - HTTP Client +Fluent API for making authenticated requests to any endpoint: +```typescript +const api = new ApiRequest(app, '/api/users'); + +// Make authenticated requests +await api.as(adminUser).get().expect(200); +await api.as(regularUser).post({ body: userData }).expect(403); +await api.as(null).get().expect(401); // Unauthenticated +``` + +#### `AuthClient` - Authentication Helper +Specialized client for authentication workflows with automatic session management: +```typescript +const authClient = new AuthClient(app); + +// Login with automatic cookie handling +const loginResponse = await authClient.login(email, password); + +// Access protected endpoints with session +await authClient.get('/api/me'); // Uses stored cookies + +// Authentication operations +await authClient.auth.logout(); +await authClient.auth.changePassword(oldPw, newPw); +await authClient.auth.forgotPassword(email); +``` + +### Database Helpers + +#### User Management +```typescript +// Seed standard test users (admin + regular user) +const { admin, user } = await seedTestUsers(); + +// Create custom test users +const customUser = await createTestUser({ + email: 'custom@test.com', + role: UserRole.ADMIN, + firstName: 'Custom', + lastName: 'User' +}); + +// Clean database between tests +await cleanDatabase(); +``` + +#### Database Access +```typescript +// Get fresh entity manager +const em = getEntityManager(); +const user = await em.findOne(User, { email: 'test@example.com' }); +``` + +### Security Testing Utilities + +#### Test Data Factories +```typescript +import { userFactory } from '../helpers/factories'; + +// Generate valid test data +const userData = userFactory.createData({ + email: 'test@example.com', + role: UserRole.USER +}); + +// Security testing payloads +userFactory.xssPayloads // XSS attack vectors +userFactory.sqlInjectionPayloads // SQL injection attempts +userFactory.invalidEmails // Invalid email formats +``` + +#### JWT Token Generation +```typescript +import { createAccessToken, createResetToken, createExpiredToken } from '../helpers/auth.spec.helpers'; + +// Create tokens for testing +const accessToken = await createAccessToken(user, jwtService, configService); +const resetToken = await createResetToken(user, jwtService, configService); +const expiredToken = await createExpiredToken(user, jwtService, configService); +``` + +### Assertion Helpers + +#### User Validation +```typescript +import { expectUser, expectPaginatedResponse } from '../helpers/assertions'; + +// Validate user object structure +expectUser(response.body.user, { + email: 'expected@example.com', + role: UserRole.ADMIN +}); + +// Validate paginated responses +expectPaginatedResponse(response.body, { + page: 1, + total: 10, + hasNext: true +}); +``` + +#### Error Validation +```typescript +import { expectValidationError, expectForbidden, expectNotFound } from '../helpers/assertions'; + +// Validate specific error types +expectValidationError(response, 'email'); // Checks for email validation error +expectForbidden(response); // Validates 403 response +expectNotFound(response); // Validates 404 response +``` + +## ๐Ÿ“ Writing Tests + +### Test Structure Pattern +```typescript +describe('Feature Name', () => { + let app: INestApplication; + let apiClient: ApiRequest; // or AuthClient for auth tests + let admin: TestUser; + let user: TestUser; + + beforeAll(async () => { + app = await createTestingApp(); + apiClient = new ApiRequest(app, '/api/endpoint'); + }); + + beforeEach(async () => { + await cleanDatabase(); + const users = await seedTestUsers(); + admin = users.admin; + user = users.user; + }); + + afterAll(async () => { + await closeTestingApp(); + }); + + describe('Specific functionality', () => { + it('should handle expected behavior', async () => { + // Test implementation + }); + }); +}); +``` + +### Best Practices + +#### 1. Use Descriptive Test Names +```typescript +// โœ… Good +it('should prevent regular users from accessing admin endpoints') +it('should validate email format and reject invalid emails') + +// โŒ Bad +it('should work') +it('test user creation') +``` + +#### 2. Test Both Success and Failure Cases +```typescript +describe('User creation', () => { + it('should create user with valid data', async () => { + // Test successful creation + }); + + it('should reject duplicate email addresses', async () => { + // Test failure case + }); + + it('should validate required fields', async () => { + // Test validation errors + }); +}); +``` + +#### 3. Use Helpers for Common Operations +```typescript +// โœ… Good - Use helpers +const { admin, user } = await seedTestUsers(); +await apiClient.as(admin).post({ body: userData }).expect(201); + +// โŒ Bad - Manual setup +const admin = await createUser({ role: 'ADMIN' }); +const token = await generateToken(admin); +const response = await request(app).post('/api/users') + .set('Authorization', `Bearer ${token}`) + .send(userData); +``` + +#### 4. Test Security Thoroughly +```typescript +describe('Security validation', () => { + it('should prevent XSS attacks in user input', async () => { + for (const xssPayload of userFactory.xssPayloads) { + const response = await api.as(admin).post({ + body: { firstName: xssPayload } + }); + // Verify XSS is blocked or sanitized + } + }); +}); +``` + +## ๐Ÿ”ง Configuration + +### Test Environment (`test.env.example`) +```env +NODE_ENV=test +PORT=3001 +LOG_LEVEL=error # Minimal logging for performance + +# In-memory database for isolation +DATABASE_NAME=:memory: +DATABASE_LOGGING=false + +# Test-specific auth settings +AUTH_JWT_SECRET=test-jwt-secret # Weak secret OK for testing +AUTH_JWT_EXPIRES_IN=7d # Longer expiration for test convenience +``` + +### Jest Configuration (`jest-e2e.json`) +- **Test Pattern**: Matches `*.e2e-spec.ts` files +- **Module Mapping**: ESM compatibility shims +- **Global Setup**: Environment initialization +- **Timeout**: 30 seconds for comprehensive tests +- **Single Worker**: Ensures test isolation + +### Database Configuration (`mikro-orm.config.ts`) +- **In-Memory SQLite**: Fast, isolated, no cleanup needed +- **Auto-Migration**: Automatic schema creation +- **Seeding**: Fresh data for each test run +- **No Foreign Keys**: Simplified testing constraints + +## ๐Ÿ“ˆ Coverage Reports + +### Generating Coverage +```bash +# Generate coverage report +pnpm test:e2e:cov + +# View HTML report +open coverage-e2e/lcov-report/index.html +``` + +### Coverage Targets +- **Overall Coverage**: >95% +- **Authentication**: >98% +- **Authorization**: 100% +- **Security Features**: 100% +- **API Endpoints**: >95% + +## ๐Ÿ› Debugging Tests + +### Debug Mode +```bash +# Run tests with debugger +pnpm test:e2e:debug + +# Debug specific test +pnpm test:e2e:debug -- --testNamePattern="specific test" +``` + +### Common Issues + +#### 1. Port Conflicts +```bash +# Kill processes on test port +lsof -ti:3001 | xargs kill -9 +``` + +#### 2. Database Connection Issues +- Verify test environment variables are loaded +- Check that in-memory database configuration is correct + +#### 3. Token Expiration +- Test tokens are configured with longer expiration +- Use helper functions to generate fresh tokens + +## ๐Ÿš€ Performance Optimization + +### Test Performance Tips +1. **Use `beforeAll` for expensive setup** (app creation) +2. **Use `beforeEach` for data setup** (database seeding) +3. **Minimize external dependencies** (mocked email service) +4. **Use in-memory database** for speed +5. **Parallel test execution** when possible + +### Monitoring Test Performance +```bash +# Run with timing information +pnpm test:e2e -- --verbose --detectOpenHandles +``` + +## ๐Ÿค Contributing to Tests + +### Adding New Tests +1. **Identify the feature area** (auth, user management, etc.) +2. **Choose appropriate test file** or create new one +3. **Use existing helpers** for common operations +4. **Follow naming conventions** and test structure +5. **Include security testing** for new endpoints +6. **Add both positive and negative test cases** + +### Test Categories to Include +- **Happy Path**: Expected successful operations +- **Validation**: Input validation and error handling +- **Authorization**: Role-based access control +- **Security**: XSS, injection, and other security concerns +- **Edge Cases**: Boundary conditions and unusual inputs +- **Data Integrity**: Consistency and constraint enforcement + +--- + +For questions about testing patterns or adding new test coverage, +refer to existing test files as examples or consult the main +[backend documentation](../README.md). diff --git a/apps/backend/test/esm-shims/README.md b/apps/backend/test/esm-shims/README.md new file mode 100644 index 0000000..a046976 --- /dev/null +++ b/apps/backend/test/esm-shims/README.md @@ -0,0 +1,21 @@ +# ESM Shims for Jest + +These files provide CommonJS-compatible versions of ESM-only packages for Jest testing. + +They are not test mocks but compatibility shims to work around Jest's limited ESM support. + +## Files + +- `app-config.js` - Shim for @app/config (internal ESM package) +- `yn.js` - Shim for yn@5.x (ESM-only npm package) + +## Why are these needed? + +1. Jest with ts-jest runs in CommonJS mode by default +2. Some dependencies are ESM-only and cannot be `require()`d +3. These shims provide the same functionality in CommonJS format + +## Note + +These are not traditional test mocks - they implement the actual functionality +of the packages they replace to ensure E2E tests behave correctly. diff --git a/apps/backend/test/esm-shims/app-config.js b/apps/backend/test/esm-shims/app-config.js new file mode 100644 index 0000000..3b715ef --- /dev/null +++ b/apps/backend/test/esm-shims/app-config.js @@ -0,0 +1,8 @@ +// Mock for @app/config package +module.exports = { + resolveOrigin: function (url) { + // Simple mock implementation for resolveOrigin + if (!url) return 'http://localhost:3000'; + return url; + }, +}; diff --git a/apps/backend/test/esm-shims/yn.js b/apps/backend/test/esm-shims/yn.js new file mode 100644 index 0000000..cfc9ee5 --- /dev/null +++ b/apps/backend/test/esm-shims/yn.js @@ -0,0 +1,27 @@ +// Mock for yn module +module.exports = function yn(input) { + if (typeof input === 'boolean') return input; + if (typeof input === 'string') { + const normalized = input.toLowerCase().trim(); + if ( + normalized === 'true' || + normalized === 'yes' || + normalized === 'y' || + normalized === '1' + ) + return true; + if ( + normalized === 'false' || + normalized === 'no' || + normalized === 'n' || + normalized === '0' + ) + return false; + } + if (typeof input === 'number') { + return input === 1; + } + return undefined; +}; + +module.exports.default = module.exports; diff --git a/apps/backend/test/global-setup.ts b/apps/backend/test/global-setup.ts new file mode 100644 index 0000000..e1bcd02 --- /dev/null +++ b/apps/backend/test/global-setup.ts @@ -0,0 +1,8 @@ +import * as dotenv from 'dotenv'; +import { join } from 'path'; + +export default async () => { + // Load test environment variables + dotenv.config({ path: join(__dirname, '../.env.test') }); + process.env.NODE_ENV = 'test'; +}; diff --git a/apps/backend/test/global-teardown.ts b/apps/backend/test/global-teardown.ts new file mode 100644 index 0000000..9a05a4c --- /dev/null +++ b/apps/backend/test/global-teardown.ts @@ -0,0 +1,3 @@ +export default async () => { + // Clean up any global resources if needed +}; diff --git a/apps/backend/test/helpers/api-request.ts b/apps/backend/test/helpers/api-request.ts new file mode 100644 index 0000000..1616f96 --- /dev/null +++ b/apps/backend/test/helpers/api-request.ts @@ -0,0 +1,45 @@ +import type { INestApplication } from '@nestjs/common'; +import type { TestUser } from './test.helpers'; +import request from 'supertest'; + +export interface RequestOptions { + path?: string; + body?: any; + query?: any; + set?: Record; +} + +export class ApiRequest { + constructor( + private readonly app: INestApplication, + private readonly baseRoute: string, + ) {} + + as(user: TestUser | null) { + return { + get: (opts?: RequestOptions) => this.request('get', user, opts), + post: (opts?: RequestOptions) => this.request('post', user, opts), + patch: (opts?: RequestOptions) => this.request('patch', user, opts), + delete: (opts?: RequestOptions) => this.request('delete', user, opts), + put: (opts?: RequestOptions) => this.request('put', user, opts), + }; + } + + private request( + method: 'get' | 'post' | 'patch' | 'delete' | 'put', + user: TestUser | null, + options: RequestOptions = {}, + ) { + const { path = '', body, query, set = {} } = options; + const apiRoute = `${this.baseRoute}${path}`; + let req = request(this.app.getHttpServer())[method](apiRoute); + if (user?.token) req = req.set('Authorization', `Bearer ${user.token}`); + if (query) req = req.query(query); + if (body) req = req.send(body); + + Object.entries(set).forEach(([key, value]) => { + req = req.set(key, value); + }); + return req; + } +} diff --git a/apps/backend/test/helpers/assertions.ts b/apps/backend/test/helpers/assertions.ts new file mode 100644 index 0000000..d2057b8 --- /dev/null +++ b/apps/backend/test/helpers/assertions.ts @@ -0,0 +1,67 @@ +export function expectUser(user: any, expectations: Partial = {}) { + expect(user).toHaveProperty('id'); + expect(user).toHaveProperty('email'); + expect(user).toHaveProperty('firstName'); + expect(user).toHaveProperty('lastName'); + expect(user).toHaveProperty('role'); + expect(user).toHaveProperty('createdAt'); + expect(user).toHaveProperty('updatedAt'); + expect(user).not.toHaveProperty('password'); + Object.entries(expectations).forEach(([key, value]) => { + expect(user[key]).toBe(value); + }); +} + +export function expectPaginatedResponse( + response: any, + expectations: Partial = {}, +) { + expect(response).toHaveProperty('data'); + expect(response).toHaveProperty('total'); + expect(response).toHaveProperty('page'); + expect(response).toHaveProperty('limit'); + expect(response).toHaveProperty('totalPages'); + expect(response).toHaveProperty('hasNext'); + expect(response).toHaveProperty('hasPrevious'); + Object.entries(expectations).forEach(([key, value]) => { + expect(response[key]).toBe(value); + }); +} + +export function expectValidationError(response: any, field?: string) { + expect(response.body).toHaveProperty('message'); + expect(response.body).toHaveProperty('error', 'Bad Request'); + expect(response.body).toHaveProperty('statusCode', 400); + if (field) { + expect(response.body.message).toEqual( + expect.arrayContaining([expect.stringContaining(field)]), + ); + } +} + +export function expectForbidden(response: any) { + expect(response.body).toHaveProperty('statusCode', 403); + if (response.body.message) { + // Message may vary based on implementation + expect(typeof response.body.message).toBe('string'); + } +} + +export function expectNotFound(response: any) { + expect(response.body).toHaveProperty('statusCode', 404); + expect(response.body.message).toContain('not found'); +} + +export function expectConflict(response: any, message?: string) { + expect(response.body).toHaveProperty('statusCode', 409); + if (message) { + expect(response.body.message).toContain(message); + } +} + +export function expectBadRequest(response: any, message?: string) { + expect(response.body).toHaveProperty('statusCode', 400); + if (message) { + expect(response.body.message).toContain(message); + } +} diff --git a/apps/backend/test/helpers/auth-client.ts b/apps/backend/test/helpers/auth-client.ts new file mode 100644 index 0000000..db9fd8d --- /dev/null +++ b/apps/backend/test/helpers/auth-client.ts @@ -0,0 +1,215 @@ +import { INestApplication } from '@nestjs/common'; +import { extractCookie, getCookieWithAttributes } from './cookie'; +import * as setCookieParser from 'set-cookie-parser'; +import request from 'supertest'; + +const AuthApiRoot = '/api/auth'; +const AuthRoutes = { + Login: `${AuthApiRoot}/login`, + Logout: `${AuthApiRoot}/logout`, + ChangePassword: `${AuthApiRoot}/change-password`, + ForgotPassword: `${AuthApiRoot}/forgot-password`, + ResetPassword: `${AuthApiRoot}/reset-password`, + ResetTokenStatus: `${AuthApiRoot}/reset-password/token-status`, +} as const; + +export interface AuthResponse { + status: number; + headers: any; + body: any; +} + +export interface LoginResponse { + user: any; + accessToken: string; + expiresIn: number; + cookie?: string; + cookieAttributes?: setCookieParser.Cookie; +} + +export interface AuthRequestOptions { + path?: string; + body?: any; + expectedStatus?: number | number[]; +} + +/** + * Auth client helper for standardized authentication operations in tests + * Uses agent-based approach for automatic cookie management like a real browser + */ +export class AuthClient { + private agent?: any; + + constructor(private readonly app: INestApplication) {} + + /** + * Fluent API for making requests to any endpoint (cookies automatically + * handled) + */ + get(path: string, options?: Omit) { + return this.makeRequest('get', path, options); + } + + post(path: string, options?: Omit) { + return this.makeRequest('post', path, options); + } + + patch(path: string, options?: Omit) { + return this.makeRequest('patch', path, options); + } + + delete(path: string, options?: Omit) { + return this.makeRequest('delete', path, options); + } + + /** + * Login and create a session (cookies automatically stored) + */ + // eslint-disable-next-line @typescript-eslint/unified-signatures + async login(email: string, pw: string, status: 200): Promise; + async login(email: string, pw: string): Promise; + async login(email: string, pw: string, status: number): Promise; + async login( + email: string, + pw: string, + status: number = 200, + ): Promise { + return this.authLogin(email, pw, status); + } + + /** + * Direct access to auth routes with fluent API + * Note: login is kept at top-level for TypeScript overload support and + * frequent usage + */ + auth = { + logout: (expectedStatus?: number | number[]) => + this.makeRequest('get', AuthRoutes.Logout, { expectedStatus }), + + changePassword: ( + currentPassword: string, + newPassword: string, + expectedStatus?: number | number[], + ) => + this.makeRequest('post', AuthRoutes.ChangePassword, { + body: { currentPassword, newPassword }, + expectedStatus, + }), + + forgotPassword: (email: string, expectedStatus?: number | number[]) => + this.makeRequest('post', AuthRoutes.ForgotPassword, { + body: { email }, + expectedStatus, + }), + + resetPassword: ( + token: string, + newPassword: string, + expectedStatus?: number | number[], + ) => + this.makeRequest('post', AuthRoutes.ResetPassword, { + body: { token, newPassword }, + expectedStatus: expectedStatus || 204, + }), + + validateResetToken: (token: string, expectedStatus?: number | number[]) => + this.makeRequest('post', AuthRoutes.ResetTokenStatus, { + body: { token }, + expectedStatus: expectedStatus || 202, + }), + }; + + private async authLogin( + email: string, + pw: string, + status: number = 200, + ): Promise { + const response = await this.makeRequest('post', AuthRoutes.Login, { + body: { email, password: pw }, + expectedStatus: status, + }); + if (status === 200) { + const cookie = this.formatCookieResponse(response.headers); + const cookieAttributes = getCookieWithAttributes( + response.headers, + 'access_token', + ); + return { + user: response.body.user, + accessToken: response.body.accessToken, + expiresIn: response.body.expiresIn, + cookie, + cookieAttributes, + } as LoginResponse; + } + return response; + } + + /** + * Reset the session (clears cookies) + */ + resetSession(): void { + this.agent = undefined; + } + + /** + * Validate auth-related response has expected shape + */ + validateLoginResponse(response: LoginResponse): void { + expect(response.user).toBeDefined(); + expect(response.accessToken).toBeDefined(); + expect(response.expiresIn).toBeDefined(); + expect(typeof response.accessToken).toBe('string'); + expect(typeof response.expiresIn).toBe('number'); + } + + private getAgent() { + if (!this.agent) { + this.agent = request.agent(this.app.getHttpServer()); + } + return this.agent; + } + + private async makeRequest( + method: 'get' | 'post' | 'patch' | 'delete', + pathOrBaseRoute: string, + options: AuthRequestOptions = {}, + ): Promise { + const { path = '', body, expectedStatus = 200 } = options; + // If path is provided, treat pathOrBaseRoute as base and append path + // If no path provided, treat pathOrBaseRoute as the full path + const fullPath = path ? `${pathOrBaseRoute}${path}` : pathOrBaseRoute; + const agent = this.getAgent(); + let req = agent[method](fullPath); + if (body) req = req.send(body); + const expectedStatuses = Array.isArray(expectedStatus) + ? expectedStatus + : [expectedStatus]; + const response = await req.expect((res) => { + if (!expectedStatuses.includes(res.status)) { + const statusStr = expectedStatuses.join(' or '); + throw new Error(`Expected status ${statusStr}, got ${res.status}`); + } + }); + + return { + status: response.status, + body: response.body, + headers: response.headers, + }; + } + + /** + * Check if cookies are enabled (some test environments may not use them) + */ + hasCookies(response: LoginResponse | AuthResponse): boolean { + if ('cookie' in response) return !!response.cookie; + if ('headers' in response) return !!response.headers?.['set-cookie']; + return false; + } + + private formatCookieResponse(headers: any): string | undefined { + const cookieValue = extractCookie(headers); + return cookieValue ? `access_token=${cookieValue}` : undefined; + } +} diff --git a/apps/backend/test/helpers/auth.spec.helpers.ts b/apps/backend/test/helpers/auth.spec.helpers.ts new file mode 100644 index 0000000..7a5b560 --- /dev/null +++ b/apps/backend/test/helpers/auth.spec.helpers.ts @@ -0,0 +1,120 @@ +import * as jwt from 'jsonwebtoken'; +import { Audience } from '../../src/modules/auth/auth.service'; +import type { AuthConfig } from '../../src/config'; +import { ConfigService } from '@nestjs/config'; +import type { JwtPayload } from '../../src/modules/auth/strategies/jwt.strategy'; +import { JwtService } from '@nestjs/jwt'; +import { User } from '../../src/database/entities'; +import ms from 'ms'; + +// Password generation util +export function generateValidPassword(): string { + return 'Test@123456'; +} + +// Mock mail service for tests +export const mockMailService = { + sendPasswordResetEmail: jest.fn().mockResolvedValue(undefined), + sendInvitationEmail: jest.fn().mockResolvedValue(undefined), +}; + +// Token configuration for different audiences +const TOKEN_CONFIG = { + [Audience.RESET]: { expiresIn: '1h' }, + [Audience.INVITATION]: { expiresIn: '7d' }, + [Audience.ACCESS]: { expiresIn: '15m' }, +} as const; + +/** + * Generate the user-specific secret for token signing + * Matches the backend's getTokenSecret implementation + */ +function generateUserSecret(user: User, config: AuthConfig): string { + return `${config.jwt.secret}-${user.password}-${user.createdAt.getTime()}`; +} + +/** + * Create a test token with configurable parameters + */ +async function createToken( + user: User, + audience: Audience, + jwtService: JwtService, + configService: ConfigService, + options?: { + expired?: boolean; + expiresIn?: string; + }, +): Promise { + const config = configService.get('auth'); + if (!config) throw new Error('Auth config not found'); + + // ACCESS tokens use default secret, others use user-specific secret + const secret = audience === Audience.ACCESS + ? config.jwt.secret + : generateUserSecret(user, config); + const tokenConfig = TOKEN_CONFIG[audience]; + const expiresIn = options?.expiresIn || tokenConfig.expiresIn; + + const payload: JwtPayload = { + sub: user.id, + email: user.email, + role: user.role, + iat: Date.now(), + }; + + // For expired tokens, use native jwt.sign to have precise control over exp + if (options?.expired) { + return jwt.sign( + { + ...payload, + iat: Date.now() - ms('2h'), // Created 2 hours ago + exp: Math.floor((Date.now() - ms('1h')) / 1000), // Expired 1 hour ago + }, + secret, + { + audience, + issuer: config.jwt.issuer, + }, + ); + } + + // Normal token creation using NestJS JwtService + return jwtService.signAsync(payload, { + secret, + expiresIn: ms(ms(expiresIn)), + audience, + issuer: config.jwt.issuer, + }); +} + +// Convenience functions for specific token types +export const createAccessToken = ( + user: User, + jwtService: JwtService, + configService: ConfigService, +): Promise => + createToken(user, Audience.ACCESS, jwtService, configService); + +export const createResetToken = ( + user: User, + jwtService: JwtService, + configService: ConfigService, +): Promise => + createToken(user, Audience.RESET, jwtService, configService); + +export const createInvitationToken = ( + user: User, + jwtService: JwtService, + configService: ConfigService, +): Promise => + createToken(user, Audience.INVITATION, jwtService, configService); + +export const createExpiredToken = ( + user: User, + jwtService: JwtService, + configService: ConfigService, +): Promise => + createToken(user, Audience.RESET, jwtService, configService, { + expired: true, + }); diff --git a/apps/backend/test/helpers/bootstrap.ts b/apps/backend/test/helpers/bootstrap.ts new file mode 100644 index 0000000..a7e2110 --- /dev/null +++ b/apps/backend/test/helpers/bootstrap.ts @@ -0,0 +1,84 @@ +import { INestApplication, ValidationPipe } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigService } from '@nestjs/config'; +import { JwtService } from '@nestjs/jwt'; +import { MailService } from '../../src/modules/mail/mail.service'; +import { MikroORM } from '@mikro-orm/core'; +import { TestAppModule } from '../test-app.module'; +import { mockMailService } from './auth.spec.helpers'; +import * as dotenv from 'dotenv'; +import cookieParser from 'cookie-parser'; +import { join } from 'path'; + +// Load test environment variables +dotenv.config({ path: join(__dirname, '../.env.test') }); + +let app: INestApplication; +let orm: MikroORM; +let jwtService: JwtService; +let configService: ConfigService; + +export async function createTestingApp(): Promise { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [TestAppModule], + }) + .overrideProvider(MailService) + .useValue(mockMailService) + .compile(); + + app = moduleFixture.createNestApplication(); + + // Add cookie parser with secret for signed cookies + // Use a test secret since we're in test environment + app.use(cookieParser('test-cookie-secret')); + + // Set global prefix to match production + app.setGlobalPrefix('api'); + + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, + forbidNonWhitelisted: true, + transform: true, + transformOptions: { + enableImplicitConversion: true, + }, + validateCustomDecorators: true, + }), + ); + + await app.init(); + + // Store service instances + orm = moduleFixture.get(MikroORM); + jwtService = moduleFixture.get(JwtService); + configService = moduleFixture.get(ConfigService); + + // Create schema + try { + await orm.schema.refreshDatabase(); + } catch (error) { + // For LibSQL in-memory, the schema might already exist + // Continue with the tests + console.error('Schema refresh error:', error); + } + return app; +} + +export async function closeTestingApp(): Promise { + if (orm) await orm.close(true); + if (app) await app.close(); +} + +// Service getters +export function getOrm(): MikroORM { + return orm; +} + +export function getJwtService(): JwtService { + return jwtService; +} + +export function getConfigService(): ConfigService { + return configService; +} diff --git a/apps/backend/test/helpers/cookie.ts b/apps/backend/test/helpers/cookie.ts new file mode 100644 index 0000000..4df3444 --- /dev/null +++ b/apps/backend/test/helpers/cookie.ts @@ -0,0 +1,54 @@ +import * as setCookieParser from 'set-cookie-parser'; + +// Types +interface SetCookieHeaders { + 'set-cookie'?: string | string[]; +} + +/** + * Parse all Set-Cookie headers using set-cookie-parser + * Returns an array of parsed cookies with all their attributes + */ +export function parseCookies( + headers: SetCookieHeaders, +): setCookieParser.Cookie[] { + const setCookieHeaders = headers['set-cookie']; + if (!setCookieHeaders) return []; + const cookieArray = Array.isArray(setCookieHeaders) + ? setCookieHeaders + : [setCookieHeaders]; + return setCookieParser.parse(cookieArray); +} + +/** + * Extract a specific cookie value from response headers + * Works with httpOnly cookies by reading Set-Cookie headers from HTTP responses + * + * @param headers - Response headers containing Set-Cookie + * @param cookieName - Name of the cookie to extract (default: 'access_token') + * @returns The cookie value or undefined if not found + */ +export function extractCookie( + headers: SetCookieHeaders, + cookieName = 'access_token', +): string | undefined { + const cookies = parseCookies(headers); + const targetCookie = cookies.find((c) => c.name === cookieName); + return targetCookie?.value; +} + +/** + * Get a specific cookie with all its attributes + * Useful for testing cookie security settings (HttpOnly, Secure, SameSite, etc.) + * + * @param headers - Response headers containing Set-Cookie + * @param cookieName - Name of the cookie to get + * @returns The parsed cookie object or undefined if not found + */ +export function getCookieWithAttributes( + headers: SetCookieHeaders, + cookieName: string, +): setCookieParser.Cookie | undefined { + const cookies = parseCookies(headers); + return cookies.find((c) => c.name === cookieName); +} diff --git a/apps/backend/test/helpers/db.helpers.ts b/apps/backend/test/helpers/db.helpers.ts new file mode 100644 index 0000000..568e8e4 --- /dev/null +++ b/apps/backend/test/helpers/db.helpers.ts @@ -0,0 +1,94 @@ +import { EntityManager } from '@mikro-orm/core'; +import { User, UserRole } from '../../src/database/entities'; +import { DatabaseSeeder } from '../../src/database/seeders/DatabaseSeeder'; +import { getOrm, getJwtService, getConfigService } from './bootstrap'; +import { createAccessToken } from './auth.spec.helpers'; +import * as bcrypt from 'bcrypt'; +import usersData from '@app/seed/user.json'; + +export interface TestUser { + id: string; + email: string; + password: string; + role: UserRole; + token?: string; +} + +export async function cleanDatabase(): Promise { + const orm = getOrm(); + if (orm) await orm.schema.clearDatabase(); +} + +export async function seedTestUsers(): Promise<{ + admin: TestUser; + user: TestUser; +}> { + const orm = getOrm(); + const em = orm.em.fork(); + + // Use the actual seed data from @app/seed + const seeder = new DatabaseSeeder(); + await seeder.run(em); + + // Get the seeded admin user + const admin = await em.findOne(User, { email: usersData[0].email }); + + // Create an additional regular user for testing + const regularUserPw = 'User123!'; + const hashedPassword = await bcrypt.hash(regularUserPw, 10); + const user = em.create(User, { + email: 'user@test.com', + password: hashedPassword, + role: UserRole.USER, + firstName: 'User', + lastName: 'Test', + } as any); + await em.persistAndFlush(user); + + const jwtService = getJwtService(); + const configService = getConfigService(); + const adminToken = await createAccessToken(admin!, jwtService, configService); + const userToken = await createAccessToken(user, jwtService, configService); + + return { + admin: { + id: admin!.id, + email: admin!.email, + password: usersData[0].password, // Original password from seed + role: admin!.role, + token: adminToken, + }, + user: { + id: user.id, + email: user.email, + password: regularUserPw, + role: user.role, + token: userToken, + }, + }; +} + +export async function createTestUser(data: Partial): Promise { + const orm = getOrm(); + const em = orm.em.fork(); + const hashedPassword = data.password + ? await bcrypt.hash(data.password, 10) + : await bcrypt.hash('Test123!', 10); + const user = em.create(User, { + email: data.email || `test${Date.now()}@test.com`, + password: hashedPassword, + role: data.role || UserRole.USER, + firstName: data.firstName || 'Test', + lastName: data.lastName || 'User', + imgUrl: data.imgUrl, + lastLoginAt: data.lastLoginAt, + deletedAt: data.deletedAt, + } as any); + await em.persistAndFlush(user); + return user; +} + +export function getEntityManager(): EntityManager { + const orm = getOrm(); + return orm.em.fork(); +} diff --git a/apps/backend/test/helpers/factories.ts b/apps/backend/test/helpers/factories.ts new file mode 100644 index 0000000..b98d17c --- /dev/null +++ b/apps/backend/test/helpers/factories.ts @@ -0,0 +1,57 @@ +import * as casual from 'casual'; +import { UserRole } from '@/database/entities'; + +export interface CreateUserData { + email?: string; + firstName?: string; + lastName?: string; + password?: string; + role?: UserRole; +} + +export interface UpdateUserData { + email?: string; + firstName?: string; + lastName?: string; + role?: UserRole; +} + +export const userFactory = { + createData: (overrides: Partial = {}): CreateUserData => ({ + email: casual.email.toLowerCase(), + firstName: casual.first_name, + lastName: casual.last_name, + role: UserRole.USER, + ...overrides, + }), + updateData: (overrides: Partial = {}): UpdateUserData => ({ + firstName: casual.first_name, + lastName: casual.last_name, + ...overrides, + }), + invalidEmails: [ + 'notanemail', + '@example.com', + 'user@', + 'user@.com', + 'user@domain', + 'user name@example.com', + 'user@exam ple.com', + ], + xssPayloads: [ + '', + '', + '', + 'javascript:alert("XSS")', + '', + '<', + ], + sqlInjectionPayloads: [ + '\'; DROP TABLE users; --', + '\' OR \'1\'=\'1', + '" OR "1"="1', + 'admin\' --', + 'admin\' #', + '\' OR 1=1 --', + ], +}; diff --git a/apps/backend/test/helpers/index.ts b/apps/backend/test/helpers/index.ts new file mode 100644 index 0000000..4340842 --- /dev/null +++ b/apps/backend/test/helpers/index.ts @@ -0,0 +1,5 @@ +export * from './api-request'; +export * from './assertions'; +export * from './cookie'; +export * from './factories'; +export * from './routes'; diff --git a/apps/backend/test/helpers/routes.ts b/apps/backend/test/helpers/routes.ts new file mode 100644 index 0000000..2d3e8cb --- /dev/null +++ b/apps/backend/test/helpers/routes.ts @@ -0,0 +1,5 @@ +export const paths = { + users: { + base: '/api/users', + }, +} as const; diff --git a/apps/backend/test/helpers/test.helpers.ts b/apps/backend/test/helpers/test.helpers.ts new file mode 100644 index 0000000..d7429d5 --- /dev/null +++ b/apps/backend/test/helpers/test.helpers.ts @@ -0,0 +1,4 @@ +// Re-export everything from specialized helper modules +export * from './bootstrap'; +export * from './db.helpers'; +export * from './auth-client'; diff --git a/apps/backend/test/jest-e2e.json b/apps/backend/test/jest-e2e.json new file mode 100644 index 0000000..45e4dea --- /dev/null +++ b/apps/backend/test/jest-e2e.json @@ -0,0 +1,20 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": "../", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.ts$": "ts-jest" + }, + "moduleNameMapper": { + "^@/(.*)$": "/src/$1", + "^@app/config$": "/test/esm-shims/app-config.js", + "^@app/(.*)$": "/../../packages/app-$1", + "^yn$": "/test/esm-shims/yn.js" + }, + "coverageDirectory": "../coverage-e2e", + "testTimeout": 30000, + "globalSetup": "/test/global-setup.ts", + "globalTeardown": "/test/global-teardown.ts", + "maxWorkers": 1 +} diff --git a/apps/backend/test/mikro-orm.config.ts b/apps/backend/test/mikro-orm.config.ts new file mode 100644 index 0000000..ec46b3f --- /dev/null +++ b/apps/backend/test/mikro-orm.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from '@mikro-orm/libsql'; +import { Migrator } from '@mikro-orm/migrations'; +import { SeedManager } from '@mikro-orm/seeder'; +import { TsMorphMetadataProvider } from '@mikro-orm/reflection'; +import { User } from '../src/database/entities'; + +export default defineConfig({ + dbName: ':memory:', + entities: [User], + entitiesTs: [User], + metadataProvider: TsMorphMetadataProvider, + migrations: { + path: './dist/database/migrations', + pathTs: './src/database/migrations', + snapshot: false, + transactional: true, + disableForeignKeys: true, + allOrNothing: true, + dropTables: true, + safe: false, + emit: 'ts', + }, + seeder: { + path: './dist/database/seeders', + pathTs: './src/database/seeders', + defaultSeeder: 'DatabaseSeeder', + glob: '!(*.d).{js,ts}', + emit: 'ts', + }, + extensions: [Migrator, SeedManager], + forceUtcTimezone: true, + allowGlobalContext: true, + discovery: { + warnWhenNoEntities: false, + requireEntitiesArray: false, + alwaysAnalyseProperties: true, + }, +}); diff --git a/apps/backend/test/specs/auth/auth.flows.e2e-spec.ts b/apps/backend/test/specs/auth/auth.flows.e2e-spec.ts new file mode 100644 index 0000000..f4bb863 --- /dev/null +++ b/apps/backend/test/specs/auth/auth.flows.e2e-spec.ts @@ -0,0 +1,115 @@ +import { INestApplication } from '@nestjs/common'; +import { + AuthClient, + TestUser, + cleanDatabase, + closeTestingApp, + createTestingApp, + createTestUser, + getConfigService, + getJwtService, + seedTestUsers, +} from '../../helpers/test.helpers'; +import { + createResetToken, + generateValidPassword, + mockMailService, +} from '../../helpers/auth.spec.helpers'; +import request from 'supertest'; + +describe('AuthController - Integration flows', () => { + let app: INestApplication; + let authClient: AuthClient; + let user: TestUser; + + beforeAll(async () => { + app = await createTestingApp(); + authClient = new AuthClient(app); + }); + + beforeEach(async () => { + await cleanDatabase(); + const users = await seedTestUsers(); + user = users.user; + authClient.resetSession(); + + // Reset mail service mock + mockMailService.sendPasswordResetEmail.mockClear(); + mockMailService.sendInvitationEmail.mockClear(); + }); + + afterAll(async () => { + await closeTestingApp(); + }); + + describe('Complete authentication flow', () => { + it('should handle full login-logout cycle', async () => { + // 1. Login + const loginResponse = await authClient.login(user.email, user.password); + authClient.validateLoginResponse(loginResponse); + // 2. Access protected endpoint + const meResponse = await authClient.get('/api/me'); + expect(meResponse.status).toBe(200); + expect(meResponse.body.email).toBe(user.email); + // 3. Change password + const newPassword = generateValidPassword(); + await authClient.auth.changePassword(user.password, newPassword); + // 4. Logout + await authClient.auth.logout(); + // 5. Login with new password + const newLoginResponse = await authClient.login(user.email, newPassword); + expect(newLoginResponse.user.email).toBe(user.email); + }); + + it('should handle concurrent sessions', async () => { + // This test specifically tests token-based auth concurrent + // sessions which is different from cookie-based sessions + // Create multiple sessions for the same user + const sessions = await Promise.all([ + authClient.login(user.email, user.password), + authClient.login(user.email, user.password), + authClient.login(user.email, user.password), + ]); + sessions.forEach((session) => authClient.validateLoginResponse(session)); + // All tokens should work independently + const tokens = sessions.map((s) => s.accessToken); + for (const token of tokens) { + const response = await request(app.getHttpServer()) + .get('/api/me') + .set('Authorization', `Bearer ${token}`); + expect(response.status).toBe(200); + expect(response.body.email).toBe(user.email); + } + }); + }); + + describe('Password reset flow', () => { + it('should complete full password reset cycle', async () => { + const testUser = await createTestUser({ + email: 'resetflow@test.com', + password: 'OldPassword123!', + }); + // 1. Request password reset + await authClient.auth.forgotPassword(testUser.email); + expect(mockMailService.sendPasswordResetEmail).toHaveBeenCalledTimes(1); + // 2. Get token from email (simulated) + const configService = getConfigService(); + const jwtService = getJwtService(); + const resetToken = await createResetToken( + testUser, + jwtService, + configService, + ); + // 3. Validate token + await authClient.auth.validateResetToken(resetToken); + // 4. Reset password + const newPassword = generateValidPassword(); + await authClient.auth.resetPassword(resetToken, newPassword); + // 5. Login with new password + const loginResponse = await authClient.login(testUser.email, newPassword); + expect(loginResponse.user.email).toBe(testUser.email); + // 6. Old password should not work + await authClient.login(testUser.email, 'OldPassword123!', 401); + }); + }); +}); diff --git a/apps/backend/test/specs/auth/auth.login.e2e-spec.ts b/apps/backend/test/specs/auth/auth.login.e2e-spec.ts new file mode 100644 index 0000000..c462173 --- /dev/null +++ b/apps/backend/test/specs/auth/auth.login.e2e-spec.ts @@ -0,0 +1,176 @@ +import { + AuthClient, + TestUser, + cleanDatabase, + closeTestingApp, + createTestUser, + createTestingApp, + seedTestUsers, + getEntityManager, +} from '../../helpers/test.helpers'; +import { INestApplication } from '@nestjs/common'; +import { User } from '@/database/entities'; +import { expectUser } from '../../helpers/assertions'; +import { userFactory } from '../../helpers/factories'; +import request from 'supertest'; + +describe('Auth login', () => { + let app: INestApplication; + let apiClient: AuthClient; + let user: TestUser; + + const fetchAuthenticatedUser = (expectedStatus = 200) => + apiClient.get('/api/me', { expectedStatus }); + + beforeAll(async () => { + app = await createTestingApp(); + apiClient = new AuthClient(app); + }); + + beforeEach(async () => { + await cleanDatabase(); + const users = await seedTestUsers(); + user = users.user; + }); + + afterAll(async () => { + await closeTestingApp(); + }); + + describe('POST /auth/login - Valid credentials', () => { + it('should login with valid credentials', async () => { + const response = await apiClient.login(user.email, user.password, 200); + apiClient.validateLoginResponse(response); + expectUser(response.user, { email: user.email, role: user.role }); + await fetchAuthenticatedUser(200); + }); + + it('should login with case-insensitive email', async () => { + const { email, password } = user; + const res = await apiClient.login(email.toUpperCase(), password, 200); + expect(res.user.email).toBe(user.email); + }); + + it('should return valid access token', async () => { + const response = await apiClient.login(user.email, user.password); + const { accessToken, expiresIn } = response; + expect(accessToken).toBeDefined(); + expect(typeof accessToken).toBe('string'); + expect(expiresIn).toBeGreaterThan(0); + apiClient.resetSession(); + const meResponse = await request(app.getHttpServer()) + .get('/api/me') + .set('Authorization', `Bearer ${accessToken}`) + .expect(200); + expect(meResponse.body.email).toBe(user.email); + }); + + it('should update lastLoginAt timestamp', async () => { + // Make sure user has a past lastLoginAt + await apiClient.login(user.email, user.password); + await apiClient.resetSession(); + const em = getEntityManager(); + const userBefore = (await em.findOne(User, user.id)) as User; + expect(userBefore.lastLoginAt).toBeDefined(); + const originalLoginAt = userBefore.lastLoginAt as Date; + // Wait to ensure timestamp difference + await new Promise((resolve) => setTimeout(resolve, 10)); + await apiClient.login(user.email, user.password); + const userAfter = (await em.findOne(User, { email: user.email })) as User; + expect(new Date(userAfter.lastLoginAt!).getTime()).toBeGreaterThan( + new Date(originalLoginAt).getTime(), + ); + }); + + it('should set secure cookies', async () => { + const response = await apiClient.login(user.email, user.password); + expect(response.cookie).toBeDefined(); + expect(response?.cookieAttributes?.httpOnly).toBe(true); + expect(response?.cookieAttributes?.maxAge).toBeGreaterThan(0); + }); + }); + + describe('POST /auth/login - Invalid credentials', () => { + it('should fail with incorrect password', async () => { + const response = await apiClient.login(user.email, 'WrongPw123!', 401); + expect(response.body.message).toContain( + 'The email or password you entered is incorrect.', + ); + expect(response.headers['set-cookie']).toBeUndefined(); + }); + + it('should fail with non-existent email', async () => { + const response = await apiClient.login('test@test.co', 'AnyPw123!', 401); + expect(response.body.message).toContain( + 'The email or password you entered is incorrect.', + ); + }); + + it('should not reveal whether email exists', async () => { + const nonExist = await apiClient.login('nonexist@te.co', 'Pwaa123!', 401); + const wrongPw = await apiClient.login(user.email, 'WrogPwd123!', 401); + expect(nonExist.body.message).toBe(wrongPw.body.message); + }); + }); + + describe('POST /auth/login - Validation', () => { + it('should validate email format', async () => { + for (const email of userFactory.invalidEmails) { + const response = await apiClient.login(email, 'ValidPassword123!', 400); + expect(response.body.message).toBeDefined(); + expect( + response.body.message.some((m: string) => + m.toLowerCase().includes('email'), + ), + ).toBe(true); + } + }); + + it('should validate password presence', async () => { + const { body } = await apiClient.login(user.email, '', 400); + expect(body.message).toBeDefined(); + expect( + body.message.some((m: string) => m.toLowerCase().includes('password')), + ).toBe(true); + }); + }); + + describe('POST /auth/login - Deleted users', () => { + it('should not allow deleted users to login', async () => { + const email = 'deleted@test.com'; + const password = 'Password123!'; + await createTestUser({ email, password, deletedAt: new Date() }); + const response = await apiClient.login(email, password, 401); + expect(response.body.message).toContain( + 'The email or password you entered is incorrect.', + ); + }); + }); + + describe('POST /auth/login - Security', () => { + it('should prevent SQL injection attempts', async () => { + for (const payload of userFactory.sqlInjectionPayloads) { + await apiClient.login(payload, 'Password123!', 400); + } + }); + + it('should handle XSS attempts safely', async () => { + for (const payload of userFactory.xssPayloads.slice(0, 3)) { + const response = await apiClient.login( + `${payload}@test.com`, + 'Password123!', + 400, + ); + expect(JSON.stringify(response.body)).not.toContain('', + '${7*7}', // Template injection + '{{7*7}}', // Template injection + ]; + for (const pattern of dangerousPatterns) { + const response = await api + .as(admin) + .get({ query: { search: pattern } }); + // Should handle safely without crashing + expect([200, 400]).toContain(response.status); + } + }); + }); +}); diff --git a/apps/backend/test/test-app.module.ts b/apps/backend/test/test-app.module.ts new file mode 100644 index 0000000..04e2c0d --- /dev/null +++ b/apps/backend/test/test-app.module.ts @@ -0,0 +1,37 @@ +import { AuthModule } from '../src/modules/auth/auth.module'; +import { CommonModule } from '../src/common/common.module'; +import { ConfigModule } from '@nestjs/config'; +import { HealthModule } from '../src/modules/health/health.module'; +import { LoggerModule } from 'nestjs-pino'; +import { MailModule } from '../src/modules/mail/mail.module'; +import { MikroOrmModule } from '@mikro-orm/nestjs'; +import { Module } from '@nestjs/common'; +import { SeedModule } from '../src/modules/seed/seed.module'; +import { UserModule } from '../src/modules/user/user.module'; + +import authConfig from '../src/config/auth.config'; +import generalConfig from '../src/config/general.config'; +import mailConfig from '../src/config/mail.config'; +import mikroOrmConfig from './mikro-orm.config'; + +@Module({ + imports: [ + ConfigModule.forRoot({ + isGlobal: true, + envFilePath: '.env.test', + load: [authConfig, generalConfig, mailConfig], + }), + // Disable logging during tests + LoggerModule.forRoot({ + pinoHttp: { level: 'silent' }, + }), + MikroOrmModule.forRoot(mikroOrmConfig), + CommonModule, + AuthModule, + HealthModule, + MailModule, + SeedModule, + UserModule, + ], +}) +export class TestAppModule {} diff --git a/apps/backend/tests/api/index.js b/apps/backend/tests/api/index.js deleted file mode 100644 index 8ddaa6f..0000000 --- a/apps/backend/tests/api/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import express from 'express'; - -import { authorize } from '../../shared/auth/mw.js'; -import ctrl from './seed.controller.js'; - -const router = express.Router(); - -router - .use(authorize()) - .post('/reset', ctrl.resetDatabase) - .post('/user', ctrl.seedUser); - -export default { - path: '/seed', - router, -}; diff --git a/apps/backend/tests/api/seed.controller.js b/apps/backend/tests/api/seed.controller.js deleted file mode 100644 index bf02385..0000000 --- a/apps/backend/tests/api/seed.controller.js +++ /dev/null @@ -1,16 +0,0 @@ -import SeedService from './seed.service.js'; - -async function resetDatabase(_req, res) { - await SeedService.resetDatabase(); - return res.status(200).send(); -} - -async function seedUser(_req, res) { - const user = await SeedService.createUser(); - return res.json({ data: user }); -} - -export default { - resetDatabase, - seedUser, -}; diff --git a/apps/backend/tests/api/seed.service.js b/apps/backend/tests/api/seed.service.js deleted file mode 100644 index ad2c809..0000000 --- a/apps/backend/tests/api/seed.service.js +++ /dev/null @@ -1,34 +0,0 @@ -import camelCase from 'lodash/camelCase.js'; -import { faker } from '@faker-js/faker'; -import mapKeys from 'lodash/mapKeys.js'; -import { role as roles } from '@app/config'; -import seedUsers from '@app/seed/user.json' with { type: 'json' }; -import db from '../../shared/database/index.js'; - -const { User } = db; - -class SeedService { - async resetDatabase() { - await db.sequelize.drop({}); - await db.initialize(); - await Promise.all( - seedUsers.map((it) => User.create(mapKeys(it, (_, k) => camelCase(k)))), - ); - return true; - } - - async createUser( - email = faker.internet.email(), - password = faker.internet.password(), - role = roles.ADMIN, - ) { - await User.create({ - email, - password, - role, - }); - return { email, password }; - } -} - -export default new SeedService(); diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json new file mode 100644 index 0000000..f2c142b --- /dev/null +++ b/apps/backend/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "ES2021", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "strictNullChecks": true, + "noImplicitAny": false, + "strictBindCallApply": false, + "forceConsistentCasingInFileNames": false, + "noFallthroughCasesInSwitch": false, + "esModuleInterop": true, + "resolveJsonModule": true, + "paths": { + "@/*": ["src/*"], + "@modules/*": ["src/modules/*"], + "@common/*": ["src/common/*"], + "@config/*": ["src/config/*"] + } + } +} \ No newline at end of file diff --git a/apps/backend/user/index.js b/apps/backend/user/index.js deleted file mode 100644 index 93c0492..0000000 --- a/apps/backend/user/index.js +++ /dev/null @@ -1,50 +0,0 @@ -import { StatusCodes } from 'http-status-codes'; -import express from 'express'; -import { authorize } from '../shared/auth/mw.js'; -import authService from '../shared/auth/index.js'; -import db from '../shared/database/index.js'; -import { processPagination } from '../shared/database/pagination.js'; -import { requestLimiter } from '../shared/request/mw.js'; -import ctrl from './user.controller.js'; -import { - loginRequestLimiter, - resetLoginAttempts, - setLoginLimitKey, -} from './mw.js'; - -const { User } = db; -const router = express.Router(); - -// Public routes: -router - .post( - '/login', - setLoginLimitKey, - loginRequestLimiter, - authService.authenticate('local', { setCookie: true }), - resetLoginAttempts, - ctrl.getProfile, - ) - .post('/forgot-password', ctrl.forgotPassword) - .use('/reset-password', requestLimiter(), authService.authenticate('token')) - .post('/reset-password', ctrl.resetPassword) - .post('/reset-password/token-status', (_, res) => - res.sendStatus(StatusCodes.ACCEPTED), - ); - -// Protected routes: -router - .use(authService.authenticate('jwt')) - .get('/', authorize(), processPagination(User), ctrl.list) - .post('/', authorize(), ctrl.upsert) - .get('/logout', authService.logout()) - .get('/me', ctrl.getProfile) - .patch('/me', ctrl.updateProfile) - .post('/me/change-password', ctrl.changePassword) - .delete('/:id', authorize(), ctrl.remove) - .post('/:id/reinvite', authorize(), ctrl.reinvite); - -export default { - path: '/users', - router, -}; diff --git a/apps/backend/user/mw.js b/apps/backend/user/mw.js deleted file mode 100644 index 92e1eea..0000000 --- a/apps/backend/user/mw.js +++ /dev/null @@ -1,22 +0,0 @@ -import crypto from 'crypto'; -import { requestLimiter } from '../shared/request/mw.js'; - -const ONE_HOUR_IN_MS = 60 * 60 * 1000; - -const loginRequestLimiter = requestLimiter({ - windowMs: ONE_HOUR_IN_MS, - limit: 15, - keyGenerator: (req) => req.userKey, -}); - -function setLoginLimitKey(req, _res, next) { - const key = [req.ip, req.body.email].join(':'); - req.userKey = crypto.createHash('sha256').update(key).digest('base64'); - return next(); -} - -function resetLoginAttempts(req, res, next) { - return loginRequestLimiter.resetKey(req.userKey).then(() => next()); -} - -export { loginRequestLimiter, setLoginLimitKey, resetLoginAttempts }; diff --git a/apps/backend/user/user.controller.js b/apps/backend/user/user.controller.js deleted file mode 100644 index 84e2817..0000000 --- a/apps/backend/user/user.controller.js +++ /dev/null @@ -1,100 +0,0 @@ -import map from 'lodash/map.js'; -import { Op } from 'sequelize'; -import { StatusCodes } from 'http-status-codes'; -import db from '../shared/database/index.js'; -import { createError, validationError } from '../shared/error/helpers.js'; - -const { User } = db; - -const createFilter = (q) => - map(['email', 'firstName', 'lastName'], (it) => ({ - [it]: { [Op.iLike]: `%${q}%` }, - })); - -function list({ query: { email, role, filter, archived }, options }, res) { - const where = { [Op.and]: [] }; - if (filter) where[Op.or] = createFilter(filter); - if (email) where[Op.and].push({ email }); - if (role) where[Op.and].push({ role }); - return User.findAndCountAll({ where, ...options, paranoid: !archived }).then( - ({ rows, count }) => { - return res.json({ data: { items: map(rows, 'profile'), total: count } }); - }, - ); -} - -function upsert({ body: { uid, email, firstName, lastName, role } }, res) { - return User.inviteOrUpdate({ uid, email, firstName, lastName, role }).then( - (data) => res.json({ data }), - ); -} - -function remove({ params: { id } }, res) { - return User.destroy({ where: { id } }).then(() => - res.sendStatus(StatusCodes.NO_CONTENT), - ); -} - -function forgotPassword({ body }, res) { - const { email } = body; - return User.unscoped() - .findOne({ where: { email } }) - .then( - (user) => user || createError(StatusCodes.NOT_FOUND, 'User not found'), - ) - .then((user) => user.sendResetToken()) - .then(() => res.end()); -} - -function resetPassword({ body, user }, res) { - const { password } = body; - return user - .update({ password }) - .then(() => res.sendStatus(StatusCodes.NO_CONTENT)); -} - -function getProfile({ user, authData }, res) { - return res.json({ user: user.profile, authData }); -} - -function updateProfile({ user, body }, res) { - const { email, firstName, lastName, imgUrl } = body; - return user - .update({ email, firstName, lastName, imgUrl }) - .then(({ profile }) => res.json({ user: profile })) - .catch(() => validationError(StatusCodes.CONFLICT)); -} - -function changePassword({ user, body }, res) { - const { currentPassword, newPassword } = body; - if (currentPassword === newPassword) - return res.sendStatus(StatusCodes.BAD_REQUEST); - return user - .authenticate(currentPassword) - .then((user) => user || createError(StatusCodes.BAD_REQUEST)) - .then((user) => user.update({ password: newPassword })) - .then(() => res.sendStatus(StatusCodes.NO_CONTENT)); -} - -function reinvite({ params }, res) { - return User.unscoped() - .findByPk(params.id) - .then( - (user) => - user || createError(StatusCodes.NOT_FOUND, 'User does not exist!'), - ) - .then((user) => User.sendInvitation(user)) - .then(() => res.status(StatusCodes.ACCEPTED).end()); -} - -export default { - list, - upsert, - remove, - forgotPassword, - resetPassword, - getProfile, - updateProfile, - changePassword, - reinvite, -}; diff --git a/apps/backend/user/user.model.js b/apps/backend/user/user.model.js deleted file mode 100644 index 35e6b7f..0000000 --- a/apps/backend/user/user.model.js +++ /dev/null @@ -1,217 +0,0 @@ -import bcrypt from 'bcrypt'; -import gravatar from 'gravatar'; -import jwt from 'jsonwebtoken'; -import map from 'lodash/map.js'; -import { Model } from 'sequelize'; -import omit from 'lodash/omit.js'; -import pick from 'lodash/pick.js'; -import Promise from 'bluebird'; -import randomstring from 'randomstring'; -import { role as roles } from '@app/config'; -import mail from '../shared/mail/index.js'; -import Audience from '../shared/auth/audience.js'; -import { auth as authConfig } from '#config'; - -const { - user: { ADMIN, INTEGRATION, USER }, -} = roles; - -const gravatarConfig = { size: 130, default: 'identicon' }; - -class User extends Model { - static fields({ DATE, ENUM, STRING, TEXT, UUID, UUIDV4, VIRTUAL }) { - return { - uid: { - type: UUID, - unique: true, - allowNull: false, - defaultValue: UUIDV4, - }, - email: { - type: STRING, - set(email) { - this.setDataValue('email', email.toLowerCase()); - }, - validate: { isEmail: true }, - unique: { msg: 'The specified email address is already in use.' }, - }, - password: { - type: STRING, - validate: { notEmpty: true, len: [5, 100] }, - defaultValue: () => randomstring.generate(), - }, - role: { - type: ENUM(ADMIN, INTEGRATION, USER), - defaultValue: USER, - }, - firstName: { - type: STRING, - field: 'first_name', - validate: { len: [2, 50] }, - }, - lastName: { - type: STRING, - field: 'last_name', - validate: { len: [2, 50] }, - }, - fullName: { - type: VIRTUAL, - get() { - return ( - [this.firstName, this.lastName].filter(Boolean).join(' ') || null - ); - }, - }, - label: { - type: VIRTUAL, - get() { - return this.fullName || this.email; - }, - }, - imgUrl: { - type: TEXT, - field: 'img_url', - get() { - const imgUrl = this.getDataValue('imgUrl'); - return imgUrl || gravatar.url(this.email, gravatarConfig, true); - }, - }, - profile: { - type: VIRTUAL, - get() { - return pick(this, [ - 'id', - 'email', - 'role', - 'firstName', - 'lastName', - 'fullName', - 'label', - 'imgUrl', - 'createdAt', - 'updatedAt', - 'deletedAt', - ]); - }, - }, - createdAt: { - type: DATE, - field: 'created_at', - }, - updatedAt: { - type: DATE, - field: 'updated_at', - }, - deletedAt: { - type: DATE, - field: 'deleted_at', - }, - }; - } - - static scopes() { - return { - defaultScope: { - attributes: { exclude: ['password'] }, - }, - }; - } - - static hooks(Hooks) { - return { - [Hooks.beforeCreate](user) { - return user.encryptPassword(); - }, - [Hooks.beforeUpdate](user) { - return user.changed('password') - ? user.encryptPassword() - : Promise.resolve(); - }, - [Hooks.beforeBulkCreate](users) { - const updates = []; - users.forEach((user) => updates.push(user.encryptPassword())); - return Promise.all(updates); - }, - }; - } - - static options() { - return { - modelName: 'user', - underscored: true, - timestamps: true, - paranoid: true, - freezeTableName: true, - }; - } - - static invite(user) { - return this.create(user).then((user) => { - this.sendInvitation(user); - return user.reload(); - }); - } - - static inviteOrUpdate(data) { - const { email } = data; - return User.findOne({ where: { email }, paranoid: false }).then((user) => { - if (!user) return User.invite(data); - const payload = omit(data, ['id', 'uid']); - map({ ...payload, deletedAt: null }, (v, k) => user.setDataValue(k, v)); - return user.save(); - }); - } - - static sendInvitation(user) { - const token = user.createToken({ - expiresIn: '5 days', - audience: Audience.Scope.Setup, - }); - mail.invite(user, token); - } - - isAdmin() { - return this.role === ADMIN || this.role === INTEGRATION; - } - - authenticate(password) { - if (!this.password) return Promise.resolve(false); - return bcrypt - .compare(password, this.password) - .then((match) => (match ? this : false)); - } - - encrypt(val) { - return bcrypt.hash(val, authConfig.saltRounds); - } - - encryptPassword() { - if (!this.password) return Promise.resolve(false); - return this.encrypt(this.password).then((pw) => (this.password = pw)); - } - - createToken(options = {}) { - const payload = { id: this.id, email: this.email }; - Object.assign(options, { - issuer: authConfig.jwt.issuer, - audience: options.audience || Audience.Scope.Access, - }); - return jwt.sign(payload, this.getTokenSecret(options.audience), options); - } - - sendResetToken() { - const token = this.createToken({ - audience: Audience.Scope.Setup, - expiresIn: '2 days', - }); - mail.resetPassword(this, token); - } - - getTokenSecret(audience) { - const { secret } = authConfig.jwt; - if (audience === Audience.Scope.Access) return secret; - return [secret, this.password, this.createdAt.getTime()].join(''); - } -} - -export default User; diff --git a/apps/frontend/api/ai.js b/apps/frontend/api/ai.js deleted file mode 100644 index 5f8c70a..0000000 --- a/apps/frontend/api/ai.js +++ /dev/null @@ -1,14 +0,0 @@ -import { extractData } from './helpers'; -import request from './request'; - -const urls = { - root: () => '/ai', -}; - -function prompt(payload) { - return request.post(urls.root(), payload).then(extractData); -} - -export default { - prompt, -}; diff --git a/apps/frontend/api/auth.js b/apps/frontend/api/auth.js deleted file mode 100644 index 447b5a8..0000000 --- a/apps/frontend/api/auth.js +++ /dev/null @@ -1,55 +0,0 @@ -import request from './request'; - -const urls = { - root: '/users', - login: () => `${urls.root}/login`, - logout: () => `${urls.root}/logout`, - forgotPassword: () => `${urls.root}/forgot-password`, - resetPassword: () => `${urls.root}/reset-password`, - resetTokenStatus: () => `${urls.resetPassword()}/token-status`, - profile: () => `${urls.root}/me`, - changePassword: () => `${urls.profile()}/change-password`, -}; - -function login(credentials) { - return request.post(urls.login(), credentials); -} - -function logout() { - return request.get(urls.logout()); -} - -function forgotPassword(email) { - return request.post(urls.forgotPassword(), { email }); -} - -function resetPassword(token, password) { - return request.post(urls.resetPassword(), { token, password }); -} - -function validateResetToken(token) { - return request.base.post(urls.resetTokenStatus(), { token }); -} - -function changePassword(currentPassword, newPassword) { - return request.post(urls.changePassword(), { currentPassword, newPassword }); -} - -function getUserInfo() { - return request.get(urls.profile()); -} - -function updateUserInfo(userData) { - return request.patch(urls.profile(), userData); -} - -export default { - login, - logout, - forgotPassword, - resetPassword, - getUserInfo, - updateUserInfo, - changePassword, - validateResetToken, -}; diff --git a/apps/frontend/api/feed.js b/apps/frontend/api/feed.js deleted file mode 100644 index afbbced..0000000 --- a/apps/frontend/api/feed.js +++ /dev/null @@ -1,16 +0,0 @@ -import { extractData } from './helpers'; -import request from './request'; - -const urls = { - root: (topicId) => `/feed/${topicId}`, - subscribe: (topicId) => `${urls.root(topicId)}/subscribe`, -}; - -function fetch(topicId) { - return request.get(urls.root(topicId)).then(extractData); -} - -export default { - urls, - fetch, -}; diff --git a/apps/frontend/api/helpers.js b/apps/frontend/api/helpers.js deleted file mode 100644 index fe222ae..0000000 --- a/apps/frontend/api/helpers.js +++ /dev/null @@ -1,3 +0,0 @@ -export function extractData(res) { - return res.data.data; -} diff --git a/apps/frontend/api/index.js b/apps/frontend/api/index.js deleted file mode 100644 index 29cfd12..0000000 --- a/apps/frontend/api/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export { default as auth } from './auth'; -export { default as feed } from './feed'; -export { default as user } from './user'; -export { default as client } from './request'; -export { extractData } from './helpers'; diff --git a/apps/frontend/api/user.js b/apps/frontend/api/user.js deleted file mode 100644 index 6fb18b5..0000000 --- a/apps/frontend/api/user.js +++ /dev/null @@ -1,25 +0,0 @@ -import { extractData } from './helpers'; -import request from './request'; - -function fetch(params) { - return request.get('/users', { params }).then(extractData); -} - -function upsert(data) { - return request.post('/users', data).then(extractData); -} - -function remove({ id }) { - return request.delete(`/users/${id}`); -} - -function reinvite({ id }) { - return request.post(`/users/${id}/reinvite`); -} - -export default { - fetch, - upsert, - remove, - reinvite, -}; diff --git a/apps/frontend/app/api/auth.js b/apps/frontend/app/api/auth.js new file mode 100644 index 0000000..b037489 --- /dev/null +++ b/apps/frontend/app/api/auth.js @@ -0,0 +1,62 @@ +import request from './request'; +import { extractData } from './helpers'; + +const urls = { + authRoot: '/auth', + login: () => `${urls.authRoot}/login`, + logout: () => `${urls.authRoot}/logout`, + forgotPassword: () => `${urls.authRoot}/forgot-password`, + resetPassword: () => `${urls.authRoot}/reset-password`, + resetTokenStatus: () => `${urls.resetPassword()}/token-status`, + changePassword: () => `${urls.authRoot}/change-password`, + profile: () => 'me', +}; + +function login(credentials) { + return request.post(urls.login(), credentials).then(extractData); +} + +function logout() { + return request.get(urls.logout()).then(extractData); +} + +function forgotPassword(email) { + return request.post(urls.forgotPassword(), { email }).then(extractData); +} + +function resetPassword(token, password) { + return request + .post(urls.resetPassword(), { token, newPassword: password }) + .then(extractData); +} + +function validateResetToken(token) { + return request.base + .post(urls.resetTokenStatus(), { token }) + .then(extractData); +} + +function changePassword(currentPassword, newPassword) { + return request + .post(urls.changePassword(), { currentPassword, newPassword }) + .then(extractData); +} + +function getUserInfo() { + return request.get(urls.profile()).then(extractData); +} + +function updateUserInfo(userData) { + return request.patch(urls.profile(), userData).then((res) => res.data); +} + +export default { + login, + logout, + forgotPassword, + resetPassword, + getUserInfo, + updateUserInfo, + changePassword, + validateResetToken, +}; diff --git a/apps/frontend/app/api/helpers.js b/apps/frontend/app/api/helpers.js new file mode 100644 index 0000000..e575b4a --- /dev/null +++ b/apps/frontend/app/api/helpers.js @@ -0,0 +1,46 @@ +// Helper to extract full response +export function extractFullResponse(res) { + return res?.data || {}; +} + +// Helper to extract data from API response format +export function extractData(res) { + const response = extractFullResponse(res); + if (response.success && response.data !== undefined) return response.data; + // Handle error responses + if (!response.success && response.error) { + const error = new Error(response.error.message || 'API Error'); + error.code = response.error.code; + error.type = response.error.type; + error.details = response.error.details; + error.meta = response.meta; + throw error; + } +} + +// Helper to extract pagination info +export function extractPaginationMeta(res) { + const response = extractFullResponse(res); + return response?.meta?.pagination || null; +} + +// Helper to get error information +export function getErrorInfo(error) { + const data = error?.response?.data; + if (data.error) { + return { + code: data.error.code, + type: data.error.type, + message: data.error.message, + details: data.error.details, + statusCode: data.meta?.statusCode || error.response.status, + }; + } + // Fallback for network errors + return { + code: 'NETWORK_ERROR', + type: 'NetworkError', + message: error.message || 'Network error occurred', + statusCode: error.response?.status || 0, + }; +} diff --git a/apps/frontend/app/api/index.ts b/apps/frontend/app/api/index.ts new file mode 100644 index 0000000..5615f4b --- /dev/null +++ b/apps/frontend/app/api/index.ts @@ -0,0 +1,13 @@ +import { createApiClient, type ApiClient } from 'app-api-client'; +import axiosClient from './request'; + +export { default as auth } from './auth'; +export { default as user } from './user'; +export { default as client } from './request'; +export { extractData } from './helpers'; + +// Pass the axios client to the API client factory +export const apiClient: ApiClient = await createApiClient({ + url: '', + axiosClient, +}); diff --git a/apps/frontend/api/request.ts b/apps/frontend/app/api/request.ts similarity index 58% rename from apps/frontend/api/request.ts rename to apps/frontend/app/api/request.ts index 14fda07..7d80066 100644 --- a/apps/frontend/api/request.ts +++ b/apps/frontend/app/api/request.ts @@ -1,5 +1,6 @@ import axios, { Axios } from 'axios'; import buildFullPath from 'axios/unsafe/core/buildFullPath'; +import { getErrorInfo } from './helpers'; Axios.prototype.submitForm = function (url, fields, options) { const action = buildFullPath(this.defaults.baseURL, url); @@ -23,7 +24,15 @@ Object.defineProperty(client, 'base', { }, }); -const isAuthError = (err) => [401, 403].includes(err.response?.status); +const isAuthError = (err: any) => { + const status = err.response?.status; + return [401, 403].includes(status); +}; + +const isRateLimitError = (err: any) => { + const status = err.response?.status; + return status === 429; +}; client.interceptors.response.use( (res) => res, @@ -31,11 +40,28 @@ client.interceptors.response.use( if (isAuthError(err)) { const isAuthenticated = useCookie('is-authenticated'); isAuthenticated.value = false; + // Remove trailing slash for consistency + const pathname = window.location.pathname.replace(/\/$/, ''); const authRoute = '/auth'; - if (window.location.pathname === authRoute) return; - if (import.meta.server) return navigateTo(authRoute); - return window.location.replace(authRoute); + if ( + pathname === authRoute || + err?.meta?.path === '/api/auth/change-password' + ) + throw err; + if (import.meta.server) navigateTo(authRoute); + window.location.replace(authRoute); + throw err; + } + const errInfo = getErrorInfo(err); + // Handle rate limiting errors + if (isRateLimitError(err)) { + console.warn('Rate limit exceeded:', errInfo); } + // Enhance error object with semantic information + err.errorCode = errInfo.code; + err.errorType = errInfo.type; + err.semanticMessage = errInfo.message; + err.errorDetails = errInfo.details; throw err; }, ); diff --git a/apps/frontend/app/api/user.js b/apps/frontend/app/api/user.js new file mode 100644 index 0000000..c73956c --- /dev/null +++ b/apps/frontend/app/api/user.js @@ -0,0 +1,52 @@ +import request from './request'; +import { + extractData, + extractFullResponse, + extractPaginationMeta, +} from './helpers'; + +function fetch(params) { + return request.get('/users', { params }).then((res) => { + const fullResponse = extractFullResponse(res); + const data = extractData(res); + const pagination = extractPaginationMeta(res); + return { + data, + total: pagination?.total || data?.length || 0, + page: pagination?.page || 1, + limit: pagination?.limit || 10, + hasNext: pagination?.has_next || false, + // Include full response for components that need meta data + _meta: fullResponse.meta, + }; + }); +} + +function create(data) { + return request.post('/users', data).then(extractFullResponse); +} + +function update(data) { + return request.patch(`/users/${data.id}`, data).then(extractFullResponse); +} + +function remove({ id }) { + return request.delete(`/users/${id}`); +} + +function reinvite({ id }) { + return request.post(`/users/${id}/reinvite`); +} + +function restore({ id }) { + return request.post(`/users/${id}/restore`); +} + +export default { + fetch, + create, + update, + remove, + reinvite, + restore, +}; diff --git a/apps/frontend/app.vue b/apps/frontend/app/app.vue similarity index 100% rename from apps/frontend/app.vue rename to apps/frontend/app/app.vue diff --git a/apps/frontend/components/admin/AdminSidebar.vue b/apps/frontend/app/components/admin/AdminSidebar.vue similarity index 100% rename from apps/frontend/components/admin/AdminSidebar.vue rename to apps/frontend/app/components/admin/AdminSidebar.vue diff --git a/apps/frontend/components/admin/UserDialog.vue b/apps/frontend/app/components/admin/UserDialog.vue similarity index 89% rename from apps/frontend/components/admin/UserDialog.vue rename to apps/frontend/app/components/admin/UserDialog.vue index fe5e9cf..e1776e4 100644 --- a/apps/frontend/components/admin/UserDialog.vue +++ b/apps/frontend/app/components/admin/UserDialog.vue @@ -86,14 +86,14 @@ import { role } from '@app/config'; import { useForm } from 'vee-validate'; import type { User } from '@app/interfaces/user'; -import { user as api } from '@/api'; +import { apiClient as api } from '@/api'; import AppDialog from '@/components/common/AppDialog.vue'; const UserRole = role.user; export interface Props { - visible: boolean; - userData: any; + visible?: boolean; + userData?: any; users: User[]; } @@ -136,7 +136,10 @@ const { defineField, errors, handleSubmit, resetForm } = useForm({ test: (email) => { if (!isNewUser.value) return true; if (props.userData.email === email) return true; - return api.fetch({ email }).then(({ total }) => !total); + return api.user + .fetch({ query: { email } }) + .then((response) => !response.data.total) + .catch(() => false); }, }), firstName: string().min(2).required(), @@ -168,22 +171,29 @@ const close = () => { }; const submit = handleSubmit(async () => { - const action = isNewUser.value ? 'create' : 'update'; - await api.upsert({ - id: props.userData?.id, + const body = { email: emailInput.value, firstName: firstNameInput.value, lastName: lastNameInput.value, role: roleInput.value, - }); - emit(`${action}d`); + }; + if (isNewUser.value) { + await api.user.create({ body }); + emit('created'); + } else { + await api.user.update({ + path: { id: props.userData.id }, + body, + }); + emit('updated'); + } close(); }); const reinvite = () => { isReinviting.value = true; - api - .reinvite({ id: props.userData.id }) + api.user + .reinvite({ path: { id: props.userData.id } }) .finally(() => (isReinviting.value = false)); }; diff --git a/apps/frontend/components/auth/Waves.vue b/apps/frontend/app/components/auth/Waves.vue similarity index 100% rename from apps/frontend/components/auth/Waves.vue rename to apps/frontend/app/components/auth/Waves.vue diff --git a/apps/frontend/components/common/AppBar.vue b/apps/frontend/app/components/common/AppBar.vue similarity index 87% rename from apps/frontend/components/common/AppBar.vue rename to apps/frontend/app/components/common/AppBar.vue index 48a178a..931ae15 100644 --- a/apps/frontend/components/common/AppBar.vue +++ b/apps/frontend/app/components/common/AppBar.vue @@ -5,7 +5,7 @@ color="primary-darken-3" height="80" > - + App logo - App - - starter - v0.1 - + Odma diff --git a/apps/frontend/lib/OidcClient.ts b/apps/frontend/app/lib/OidcClient.ts similarity index 100% rename from apps/frontend/lib/OidcClient.ts rename to apps/frontend/app/lib/OidcClient.ts diff --git a/apps/frontend/lib/radio.ts b/apps/frontend/app/lib/radio.ts similarity index 100% rename from apps/frontend/lib/radio.ts rename to apps/frontend/app/lib/radio.ts diff --git a/apps/frontend/lib/vite-plugins/injectConfigHeaders.ts b/apps/frontend/app/lib/vite-plugins/injectConfigHeaders.ts similarity index 100% rename from apps/frontend/lib/vite-plugins/injectConfigHeaders.ts rename to apps/frontend/app/lib/vite-plugins/injectConfigHeaders.ts diff --git a/apps/frontend/middleware/auth.ts b/apps/frontend/app/middleware/auth.ts similarity index 90% rename from apps/frontend/middleware/auth.ts rename to apps/frontend/app/middleware/auth.ts index a6e5bd9..2074007 100644 --- a/apps/frontend/middleware/auth.ts +++ b/apps/frontend/app/middleware/auth.ts @@ -4,7 +4,7 @@ export default async function () { const isAuthenticated = useCookie('is-authenticated'); const authStore = useAuthStore(); if (authStore.user) return; - await authStore.fetchUserInfo(); + await authStore.me(); isAuthenticated.value = authStore.user ? 'true' : null; if (!isAuthenticated.value) return navigateTo({ name: 'sign-in' }); } diff --git a/apps/frontend/pages/admin.vue b/apps/frontend/app/pages/admin.vue similarity index 88% rename from apps/frontend/pages/admin.vue rename to apps/frontend/app/pages/admin.vue index a351ef2..e9153f1 100644 --- a/apps/frontend/pages/admin.vue +++ b/apps/frontend/app/pages/admin.vue @@ -23,7 +23,7 @@ diff --git a/apps/frontend/pages/admin/user-management.vue b/apps/frontend/app/pages/admin/user-management.vue similarity index 87% rename from apps/frontend/pages/admin/user-management.vue rename to apps/frontend/app/pages/admin/user-management.vue index f6678d5..6959ea6 100644 --- a/apps/frontend/pages/admin/user-management.vue +++ b/apps/frontend/app/pages/admin/user-management.vue @@ -105,10 +105,10 @@ diff --git a/apps/frontend/pages/auth/reset-password/[token].vue b/apps/frontend/app/pages/auth/reset-password/index.vue similarity index 88% rename from apps/frontend/pages/auth/reset-password/[token].vue rename to apps/frontend/app/pages/auth/reset-password/index.vue index 9405049..cd2ab2c 100644 --- a/apps/frontend/pages/auth/reset-password/[token].vue +++ b/apps/frontend/app/pages/auth/reset-password/index.vue @@ -67,9 +67,10 @@ diff --git a/apps/frontend/pages/user/profile.vue b/apps/frontend/app/pages/user/profile.vue similarity index 100% rename from apps/frontend/pages/user/profile.vue rename to apps/frontend/app/pages/user/profile.vue diff --git a/apps/frontend/plugins/core-services.ts b/apps/frontend/app/plugins/core-services.ts similarity index 100% rename from apps/frontend/plugins/core-services.ts rename to apps/frontend/app/plugins/core-services.ts diff --git a/apps/frontend/plugins/eventbus.ts b/apps/frontend/app/plugins/eventbus.ts similarity index 100% rename from apps/frontend/plugins/eventbus.ts rename to apps/frontend/app/plugins/eventbus.ts diff --git a/apps/frontend/plugins/oidc.ts b/apps/frontend/app/plugins/oidc.ts similarity index 100% rename from apps/frontend/plugins/oidc.ts rename to apps/frontend/app/plugins/oidc.ts diff --git a/apps/frontend/plugins/v-clipboard.ts b/apps/frontend/app/plugins/v-clipboard.ts similarity index 100% rename from apps/frontend/plugins/v-clipboard.ts rename to apps/frontend/app/plugins/v-clipboard.ts diff --git a/apps/frontend/plugins/vee-validate.ts b/apps/frontend/app/plugins/vee-validate.ts similarity index 100% rename from apps/frontend/plugins/vee-validate.ts rename to apps/frontend/app/plugins/vee-validate.ts diff --git a/apps/frontend/plugins/vuetify.ts b/apps/frontend/app/plugins/vuetify.ts similarity index 100% rename from apps/frontend/plugins/vuetify.ts rename to apps/frontend/app/plugins/vuetify.ts diff --git a/apps/frontend/plugins/yup.ts b/apps/frontend/app/plugins/yup.ts similarity index 100% rename from apps/frontend/plugins/yup.ts rename to apps/frontend/app/plugins/yup.ts diff --git a/apps/frontend/app/stores/auth.ts b/apps/frontend/app/stores/auth.ts new file mode 100644 index 0000000..36f7aee --- /dev/null +++ b/apps/frontend/app/stores/auth.ts @@ -0,0 +1,101 @@ +import type { LoginDto, UserDto } from 'app-api-client'; + +import { apiClient as api } from '@/api'; + +export const useAuthStore = defineStore('auth', () => { + const user = ref(null); + const strategy = ref(null); + + const isAdmin = computed(() => user.value?.role === 'ADMIN'); + const isDefaultUser = computed(() => user.value?.role === 'USER'); + const isOidcActive = computed(() => strategy.value === 'oidc'); + + function $reset( + userData: UserDto | null = null, + authStrategy: string | null = null, + ) { + user.value = userData; + strategy.value = authStrategy; + } + + function login(credentials: LoginDto): Promise { + return api.auth.login({ body: credentials }).then((response) => { + if ( + response.statusCode >= 200 && + response.statusCode < 300 && + response.data + ) { + const { user } = response.data; + const authStrategy = 'local'; + $reset(user, authStrategy); + return; + } + throw new Error(response?.body?.error?.message || 'Login failed'); + }); + } + + function logout() { + return api.auth.logout().then(() => $reset()); + } + + function forgotPassword({ email }: { email: string }) { + return api.auth.forgotPassword({ body: { email } }); + } + + function resetPassword({ + password, + token, + }: { + password: string; + token: string; + }) { + return api.auth.resetPassword({ body: { token, newPassword: password } }); + } + + function changePassword({ + currentPassword, + newPassword, + }: { + currentPassword: string; + newPassword: string; + }) { + return api.auth + .changePassword({ body: { currentPassword, newPassword } }) + .then((res) => { + if (res.statusCode === 200) return res; + throw new Error(res?.body?.error?.message || 'Change password failed'); + }); + } + + function me() { + return api.currentUser + .get() + .then((res) => { + const authStrategy = 'local'; + $reset(res.data, authStrategy); + }) + .catch(() => $reset()); + } + + function updateCurrentUser(payload: any) { + return api.currentUser.update({ body: payload }).then((res) => { + user.value = res.data; + return res; + }); + } + + return { + user, + isAdmin, + isDefaultUser, + isOidcActive, + login, + logout, + forgotPassword, + resetPassword, + changePassword, + me, + updateCurrentUser, + $reset, + }; +}); diff --git a/apps/frontend/stores/config.ts b/apps/frontend/app/stores/config.ts similarity index 100% rename from apps/frontend/stores/config.ts rename to apps/frontend/app/stores/config.ts diff --git a/apps/frontend/app/types/api.ts b/apps/frontend/app/types/api.ts new file mode 100644 index 0000000..063a4dc --- /dev/null +++ b/apps/frontend/app/types/api.ts @@ -0,0 +1,44 @@ +export interface ApiMeta { + path: string; + method: string; + statusCode?: number; + timestamp: string; + duration: number; + version?: string; + request_id?: string; + pagination?: { + total: number; + page: number; + limit: number; + has_next: boolean; + }; +} + +export interface ApiError { + code: string; + type: string; + message: string; + details?: any[]; +} + +export interface EnhancedApiResponse { + success: boolean; + data?: T; + error?: ApiError; + meta: ApiMeta; +} + +// Type helpers for better dev experience +export type SuccessApiResponse = EnhancedApiResponse & { + success: true; + data: T; + error?: never; +}; + +export type ErrorApiResponse = EnhancedApiResponse & { + success: false; + data?: never; + error: ApiError; +}; + +export type ApiResponse = SuccessApiResponse | ErrorApiResponse; diff --git a/apps/frontend/composables/useEditorBus.ts b/apps/frontend/composables/useEditorBus.ts deleted file mode 100644 index 66d85ff..0000000 --- a/apps/frontend/composables/useEditorBus.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const useEditorBus = () => { - const { $eventBus } = useNuxtApp() as any; - return $eventBus.channel('editor'); -}; diff --git a/apps/frontend/nuxt.config.ts b/apps/frontend/nuxt.config.ts index 35ab179..8022a22 100644 --- a/apps/frontend/nuxt.config.ts +++ b/apps/frontend/nuxt.config.ts @@ -1,4 +1,4 @@ -import injectConfigHeaders from './lib/vite-plugins/injectConfigHeaders'; +import injectConfigHeaders from './app/lib/vite-plugins/injectConfigHeaders'; // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 8487e85..6270598 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -13,45 +13,46 @@ "@app/interfaces": "workspace:*", "@types/bluebird": "^3.5.42", "@types/debug": "^4.1.12", - "@types/lodash": "^4.17.13", + "@types/lodash": "^4.17.20", "@types/pluralize": "^0.0.33", "@types/promise-queue": "^2.2.3", - "@typescript-eslint/parser": "^6.9.0", - "autoprefixer": "^10.4.20", - "nuxt": "3.13.0", - "sass": "^1.79.5", - "vue": "^3.5.12", - "vue-router": "^4.4.5" + "@typescript-eslint/parser": "^8.46.0", + "autoprefixer": "^10.4.21", + "nuxt": "4.1.2", + "sass": "^1.93.2", + "vue": "^3.5.22", + "vue-router": "^4.5.1" }, "dependencies": { "@mdi/font": "7.4.47", "@paralleldrive/cuid2": "^2.2.2", - "@pinia/nuxt": "^0.5.1", - "@vee-validate/i18n": "^4.14.6", - "@vee-validate/rules": "^4.14.6", - "@vueuse/core": "^10.11.0", - "axios": "^1.7.7", + "@pinia/nuxt": "^0.11.2", + "@vee-validate/i18n": "^4.15.1", + "@vee-validate/rules": "^4.15.1", + "@vueuse/core": "^13.9.0", + "app-api-client": "workspace:*", + "axios": "^1.12.2", "bluebird": "^3.7.2", "compressorjs": "^1.2.1", - "date-fns": "^3.6.0", - "debug": "^4.3.7", + "date-fns": "^4.1.0", + "debug": "^4.4.3", "fecha": "^4.2.3", "hashids": "^2.3.0", - "humanize-string": "^3.0.0", + "humanize-string": "^3.1.0", "lodash": "^4.17.21", "mitt": "^3.0.1", - "p-min-delay": "^4.0.2", - "pinia": "^2.2.6", + "p-min-delay": "^4.2.0", + "pinia": "^3.0.3", "pluralize": "^8.0.0", "promise-queue": "^2.2.5", "@app/config": "workspace:*", "to-case": "^2.0.0", "url-join": "^5.0.0", "v-clipboard": "3.0.0-next.1", - "vee-validate": "4.14.6", - "vue3-tree-vue": "^2.0.11", + "vee-validate": "4.15.1", + "vue3-tree-vue": "^2.0.15", "vuedraggable": "4.1.0", - "vuetify": "3.7.4", - "yup": "^1.4.0" + "vuetify": "3.10.5", + "yup": "^1.7.1" } } diff --git a/apps/frontend/public/favicon.ico b/apps/frontend/public/favicon.ico index 0c4c31f..bc239cc 100644 Binary files a/apps/frontend/public/favicon.ico and b/apps/frontend/public/favicon.ico differ diff --git a/apps/frontend/public/img/default-logo-animated.svg b/apps/frontend/public/img/default-logo-animated.svg new file mode 100644 index 0000000..6e31f3e --- /dev/null +++ b/apps/frontend/public/img/default-logo-animated.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/frontend/public/img/default-logo-compact.svg b/apps/frontend/public/img/default-logo-compact.svg index f3abbec..7159527 100644 --- a/apps/frontend/public/img/default-logo-compact.svg +++ b/apps/frontend/public/img/default-logo-compact.svg @@ -1,19 +1,48 @@ - + - + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/apps/frontend/public/img/default-logo-full.svg b/apps/frontend/public/img/default-logo-full.svg index b47d5b9..e2e3551 100644 --- a/apps/frontend/public/img/default-logo-full.svg +++ b/apps/frontend/public/img/default-logo-full.svg @@ -1,33 +1,54 @@ - + - + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/apps/frontend/stores/auth.ts b/apps/frontend/stores/auth.ts deleted file mode 100644 index 7529694..0000000 --- a/apps/frontend/stores/auth.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type { User } from '@app/interfaces/user'; - -import { auth as api } from '@/api'; - -export const useAuthStore = defineStore('auth', () => { - const user = ref(null); - const strategy = ref(null); - - const isAdmin = computed(() => user.value?.role === 'ADMIN'); - const isDefaultUser = computed(() => user.value?.role === 'USER'); - - const isOidcActive = computed(() => strategy.value === 'oidc'); - - function $reset( - userData: User | null = null, - authStrategy: string | null = null, - ) { - user.value = userData; - strategy.value = authStrategy; - } - - function login(credentials: { - email: string; - password: string; - }): Promise { - return api - .login(credentials) - .then(({ data: { user, authData } }) => $reset(user, authData?.strategy)); - } - - function logout() { - return api.logout().then(() => $reset()); - } - - function forgotPassword({ email }: { email: string }) { - return api.forgotPassword(email); - } - - function resetPassword({ - password, - token, - }: { - password: string; - token: string; - }) { - return api.resetPassword(token, password); - } - - function changePassword({ - currentPassword, - newPassword, - }: { - currentPassword: string; - newPassword: string; - }) { - return api.changePassword(currentPassword, newPassword); - } - - function fetchUserInfo() { - return api - .getUserInfo() - .then(({ data: { user, authData } }) => $reset(user, authData?.strategy)) - .catch(() => $reset()); - } - - function updateInfo(payload: any) { - return api - .updateUserInfo(payload) - .then(({ data }) => (user.value = data.user)); - } - - return { - user, - isAdmin, - isDefaultUser, - isOidcActive, - login, - logout, - forgotPassword, - resetPassword, - changePassword, - fetchUserInfo, - updateInfo, - $reset, - }; -}); diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml index 3741e46..0ac361a 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.dev.yaml @@ -4,7 +4,7 @@ services: container_name: "app-starter-postgres" image: "postgres:15.1" environment: - POSTGRES_DB: "app_starter" + POSTGRES_DB: "odma" POSTGRES_USER: "dev" POSTGRES_PASSWORD: "dev" expose: diff --git a/docker-compose.yaml b/docker-compose.yaml index 976d6b2..5761324 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,7 +4,7 @@ services: container_name: "postgres" image: "postgres:15.1" environment: - POSTGRES_DB: "app_starter" + POSTGRES_DB: "odma" POSTGRES_USER: "dev" POSTGRES_PASSWORD: "dev" expose: @@ -33,7 +33,7 @@ services: PORT: 3000 REVERSE_PROXY_PORT: 3000 DATABASE_HOST: "postgres" - DATABASE_NAME: "app_starter" + DATABASE_NAME: "odma" DATABASE_USER: "dev" DATABASE_PASSWORD: "dev" restart: "no" diff --git a/docs/dev/general/setup.md b/docs/dev/general/setup.md index c84b3e7..7e09c19 100644 --- a/docs/dev/general/setup.md +++ b/docs/dev/general/setup.md @@ -18,7 +18,7 @@ dependencies: Before you begin, ensure you have the following installed: - [Node.js (version 22.x or higher)](https://nodejs.org/en/download/) -- [pnpm (version 9.0.6 or higher)](https://pnpm.io/installation) +- [pnpm (version 10.17.1 or higher)](https://pnpm.io/installation) - Clone the repository to your local machine. ### Setup Using Docker diff --git a/eslint.config.js b/eslint.config.js index dd64a73..52ef978 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -12,6 +12,8 @@ export default createConfigForNuxt({ arrowParens: 'always', }, }, +}).append({ + ignores: ['packages/app-api-client/**'], }).append({ rules: { 'max-len': ['error', { code: 90, comments: 100, ignoreUrls: true }], @@ -34,4 +36,10 @@ export default createConfigForNuxt({ '@stylistic/indent-binary-ops': 'off', '@typescript-eslint/no-explicit-any': 'off', }, +}).append({ + files: ['apps/backend/**/*.ts'], + rules: { + '@typescript-eslint/no-extraneous-class': 'off', + '@typescript-eslint/consistent-type-imports': 'off', + }, }); diff --git a/infrastructure/Pulumi.dev.yaml b/infrastructure/Pulumi.dev.yaml index 2d8784b..e66d508 100644 --- a/infrastructure/Pulumi.dev.yaml +++ b/infrastructure/Pulumi.dev.yaml @@ -1,23 +1,8 @@ config: - ai:modelId: gpt-4o aws:region: us-east-1 - dns:domain: app-starter.com + dns:domain: api.tailor-cms.com dns:hostedZoneId: my_hosted_zone_id - s3:bucket: my_bucket_name - s3:region: eu-central-1 - email:host: email-smtp.us-east-1.amazonaws.com - email:senderAddress: me@app_starter.com + mail:host: email-smtp.us-east-1.amazonaws.com + mail:senderAddress: me@odma.com ssm:keyPrefix: app/dev app-starter:resourceNamePrefix: app-starter - oidc:enabled: "true" - oidc:loginText: Sign in with Google - oidc:defaultRole: USER - oidc:allowSignup: "true" - oidc:issuer: https://accounts.google.com - oidc:jwksUrl: https://www.googleapis.com/oauth2/v3/certs - oidc:authorizationEndpoint: https://accounts.google.com/o/oauth2/v2/auth - oidc:tokenEndpoint: https://oauth2.googleapis.com/token - oidc:userinfoEndpoint: https://openidconnect.googleapis.com/v1/userinfo - oidc:logoutEnabled: "" - oidc:logoutEndpoint: "" - oidc:postLogoutUriKey: "" diff --git a/infrastructure/README.md b/infrastructure/README.md new file mode 100644 index 0000000..1f5dc20 --- /dev/null +++ b/infrastructure/README.md @@ -0,0 +1,314 @@ +# Infrastructure Deployment + +AWS infrastructure provisioning for the App Starter project using Pulumi and TypeScript. + +## ๐Ÿ—๏ธ Architecture Overview + +This infrastructure deploys: +- **Database**: PostgreSQL RDS instance with automated backups +- **Application**: Containerized NestJS backend with auto-scaling +- **Networking**: VPC, subnets, security groups, load balancer +- **DNS**: Route53 hosted zone and SSL certificates +- **Secrets**: AWS Systems Manager Parameter Store for sensitive data +- **Monitoring**: CloudWatch logs and metrics + +## ๐Ÿ“‹ Prerequisites + +### Required Tools +```bash +# Install Pulumi CLI +curl -fsSL https://get.pulumi.com | sh + +# Install AWS CLI +# macOS: brew install awscli +# Linux: pip install awscli + +# Install Node.js 22+ and pnpm +# macOS: brew install node pnpm +``` + +### AWS Account Setup +1. **AWS Account** with administrative access +2. **AWS CLI configured** with appropriate credentials: + ```bash + aws configure + ``` +3. **Domain name** registered and managed in Route53 +4. **Hosted Zone ID** for your domain + +## ๐Ÿ› ๏ธ Configuration + +### 1. Update Pulumi Configuration +Edit `Pulumi.dev.yaml` with your specific values: + +```yaml +config: + aws:region: us-east-1 # Your preferred AWS region + dns:domain: your-domain.com # Your domain name + dns:hostedZoneId: Z1234567890ABCDEF # Your Route53 hosted zone ID + mail:host: email-smtp.us-east-1.amazonaws.com # Your SMTP host + mail:senderAddress: noreply@your-domain.com # Your sender email + ssm:keyPrefix: app/dev # SSM parameter prefix + app-starter:resourceNamePrefix: your-app # Resource naming prefix +``` + +### 2. Set Up AWS Secrets +Store sensitive configuration in AWS Systems Manager Parameter Store: + +```bash +# Set your AWS region +export AWS_REGION=us-east-1 + +# Set your SSM key prefix (match Pulumi.dev.yaml) +export SSM_PREFIX="app/dev" + +# Create secure parameters +aws ssm put-parameter \ + --name "/${SSM_PREFIX}/AUTH_JWT_SECRET" \ + --value "your-super-secure-jwt-secret-here" \ + --type "SecureString" \ + --description "JWT secret for authentication" + +aws ssm put-parameter \ + --name "/${SSM_PREFIX}/MAIL_USER" \ + --value "your-smtp-username" \ + --type "SecureString" \ + --description "SMTP authentication username" + +aws ssm put-parameter \ + --name "/${SSM_PREFIX}/MAIL_PASSWORD" \ + --value "your-smtp-password" \ + --type "SecureString" \ + --description "SMTP authentication password" +``` + +### 3. Verify Domain Setup +Ensure your domain is properly configured: +```bash +# Check if your domain's hosted zone exists +aws route53 list-hosted-zones-by-name --dns-name your-domain.com + +# Note the HostedZoneId for your Pulumi configuration +``` + +## ๐Ÿš€ Deployment Steps + +### 1. Install Dependencies +```bash +cd infrastructure +pnpm install +``` + +### 2. Initialize Pulumi Stack +```bash +# Login to Pulumi (choose your backend) +pulumi login # For Pulumi Service (free tier available) +# OR +pulumi login --local # For local state management + +# Initialize the stack +pulumi stack init dev +``` + +### 3. Preview Deployment +```bash +# Preview what will be created +pulumi preview + +# Review the planned changes carefully +# Ensure all configurations look correct +``` + +### 4. Deploy Infrastructure +```bash +# Deploy the infrastructure +pulumi up + +# Type 'yes' when prompted to confirm deployment +# This process typically takes 10-15 minutes +``` + +### 5. Verify Deployment +```bash +# Check deployment status +pulumi stack output + +# Test the application endpoint +curl https://your-domain.com/api/health +``` + +## ๐Ÿ“Š Post-Deployment + +### Application Access +- **API Endpoint**: `https://your-domain.com/api` +- **Health Check**: `https://your-domain.com/api/health` +- **API Documentation**: `https://your-domain.com/api/docs` + +### Database Access +The database is only accessible from within the VPC for security. To connect: + +1. **Via Application**: The deployed app automatically connects +2. **For Management**: Use an EC2 bastion host or VPN connection +3. **Database Details**: Available in Pulumi stack outputs + +### Logs and Monitoring +```bash +# View application logs +aws logs describe-log-groups --log-group-name-prefix "/aws/ecs/app-starter" + +# Follow real-time logs +aws logs tail "/aws/ecs/app-starter" --follow +``` + +## ๐Ÿ”ง Configuration Management + +### Environment Variables +The infrastructure automatically configures these environment variables for the application: + +**General Configuration:** +- `NODE_ENV=production` +- `LOG_LEVEL=info` +- `HOSTNAME=your-domain.com` +- `PORT=3000` +- `REVERSE_PROXY_PORT=443` +- `CORS_ALLOWED_ORIGINS=https://your-domain.com` + +**Database Configuration:** +- `DATABASE_HOST` (RDS endpoint) +- `DATABASE_PORT=5432` +- `DATABASE_NAME` (from RDS) +- `DATABASE_USERNAME` (from RDS) +- `DATABASE_PASSWORD` (from AWS Secrets Manager) +- `DATABASE_SSL=true` +- `DATABASE_LOGGING=false` + +**Authentication Configuration:** +- `AUTH_JWT_ISSUER=App` +- `AUTH_JWT_SECRET` (from SSM Parameter Store) +- `AUTH_JWT_EXPIRES_IN=7d` +- `AUTH_COOKIE_NAME=access_token` +- `AUTH_SALT_ROUNDS=12` + +**Mail Configuration:** +- `MAIL_HOST` (from configuration) +- `MAIL_PORT=587` +- `MAIL_USER` (from SSM Parameter Store) +- `MAIL_PASSWORD` (from SSM Parameter Store) +- `MAIL_SECURE=true` +- `MAIL_FROM_NAME=App` +- `MAIL_FROM_EMAIL` (from configuration) + +### Updating Secrets +```bash +# Update JWT secret +aws ssm put-parameter \ + --name "/${SSM_PREFIX}/AUTH_JWT_SECRET" \ + --value "new-jwt-secret" \ + --type "SecureString" \ + --overwrite + +# Update email credentials +aws ssm put-parameter \ + --name "/${SSM_PREFIX}/MAIL_USER" \ + --value "new-username" \ + --type "SecureString" \ + --overwrite + +# Restart the application to pick up new secrets +# (Application will automatically restart in ECS) +``` + +## ๐Ÿ”„ Updates and Maintenance + +### Updating Infrastructure +```bash +# Make changes to your Pulumi code or configuration +# Preview changes +pulumi preview + +# Apply updates +pulumi up +``` + +### Updating Application +The infrastructure is designed for container-based deployments. Update your application by: + +1. Building and pushing a new container image +2. Updating the ECS service to use the new image +3. ECS will perform a rolling update automatically + +### Backup and Recovery +- **Database Backups**: Automated daily backups with 7-day retention +- **Point-in-time Recovery**: Available for the database +- **Infrastructure State**: Pulumi state is managed in your chosen backend + +## ๐Ÿ”’ Security Considerations + +### Network Security +- Application runs in private subnets +- Database is only accessible from application subnets +- Load balancer provides SSL termination +- Security groups restrict access to necessary ports only + +### Secrets Management +- All sensitive data stored in AWS Parameter Store (encrypted) +- Database password managed by AWS Secrets Manager +- Application retrieves secrets at runtime +- No secrets stored in code or configuration files + +### SSL/TLS +- Automatic SSL certificate provisioning via ACM +- HTTPS enforced for all web traffic +- Secure communication between all components + +## ๐Ÿงน Cleanup + +To destroy the infrastructure: + +```bash +# Preview what will be destroyed +pulumi destroy --show-config + +# Destroy the infrastructure +pulumi destroy + +# Type 'yes' when prompted +# This process typically takes 5-10 minutes +``` + +**Note**: This will permanently delete all resources including the database. Ensure you have backups if needed. + +## ๐Ÿ†˜ Troubleshooting + +### Common Issues + +**Deployment Fails with DNS Errors:** +- Verify your hosted zone ID is correct +- Ensure the domain is properly configured in Route53 +- Check that your AWS credentials have Route53 permissions + +**Application Not Starting:** +- Check ECS task logs: `aws logs tail "/aws/ecs/app-starter" --follow` +- Verify all required SSM parameters are set +- Ensure database is accessible from application subnets + +**SSL Certificate Issues:** +- Certificate validation requires DNS control +- Ensure your domain's nameservers point to Route53 +- Certificate provisioning can take 5-10 minutes + +**Database Connection Issues:** +- Verify security group rules allow database access +- Check that DATABASE_HOST environment variable is correct +- Ensure database is in the same VPC as the application + +### Getting Help +- Check Pulumi stack outputs: `pulumi stack output` +- Review AWS CloudFormation events in the console +- Examine ECS task definitions and service status +- Monitor CloudWatch logs for application errors + +### Support Resources +- [Pulumi Documentation](https://www.pulumi.com/docs/) +- [AWS Documentation](https://docs.aws.amazon.com/) +- [Project Repository Issues](https://github.com/your-repo/issues) \ No newline at end of file diff --git a/infrastructure/package.json b/infrastructure/package.json index 9762d73..fa00a2d 100644 --- a/infrastructure/package.json +++ b/infrastructure/package.json @@ -2,12 +2,12 @@ "name": "@app/infrastucture", "main": "src/index.ts", "devDependencies": { - "@types/node": "^22" + "@types/node": "^24" }, "dependencies": { - "@pulumi/aws": "^6.58.0", - "@pulumi/awsx": "^2.17.0", - "@pulumi/pulumi": "^3.138.0", - "@studion/infra-code-blocks": "^0.6.11" + "@pulumi/aws": "^7.8.0", + "@pulumi/awsx": "^3.0.0", + "@pulumi/pulumi": "^3.202.0", + "@studion/infra-code-blocks": "^0.7.0" } } diff --git a/infrastructure/src/env.ts b/infrastructure/src/env.ts index 8e314cc..4500942 100644 --- a/infrastructure/src/env.ts +++ b/infrastructure/src/env.ts @@ -2,12 +2,9 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; import type * as studion from '@studion/infra-code-blocks'; -const aiConfig = new pulumi.Config('ai'); -const oidcConfg = new pulumi.Config('oidc'); const awsConfig = new pulumi.Config('aws'); -const emailConfig = new pulumi.Config('email'); +const mailConfig = new pulumi.Config('mail'); const dnsConfig = new pulumi.Config('dns'); -const s3Config = new pulumi.Config('s3'); const ssmConfig = new pulumi.Config('ssm'); const accountId = aws.getCallerIdentityOutput().accountId; @@ -19,81 +16,45 @@ function getSsmParam(key: string) { } export const getEnvVariables = (db: studion.Database) => [ - // Will trigger DB migrations on startup - { name: 'NODE_ENV', value: 'development' }, - { name: 'LOG_LEVEL', value: 'INFO' }, + // General configuration + { name: 'NODE_ENV', value: 'production' }, + { name: 'LOG_LEVEL', value: 'info' }, { name: 'HOSTNAME', value: dnsConfig.require('domain') }, - { name: 'PROTOCOL', value: 'https' }, - // Internal service port { name: 'PORT', value: '3000' }, - // Outward facing port { name: 'REVERSE_PROXY_PORT', value: '443' }, { name: 'CORS_ALLOWED_ORIGINS', value: `https://${dnsConfig.require('domain')}`, }, + // Database configuration { name: 'DATABASE_HOST', value: db.instance.address }, { name: 'DATABASE_PORT', value: db.instance.port.apply((port: number) => String(port)), }, - { name: 'DATABASE_SSL', value: 'true' }, - { name: 'DATABASE_USER', value: db.instance.username }, { name: 'DATABASE_NAME', value: db.instance.dbName }, - { name: 'DATABASE_ADAPTER', value: 'postgres' }, - { name: 'STORAGE_PROVIDER', value: 'amazon' }, - { name: 'STORAGE_REGION', value: s3Config.require('region') }, - // Create a bucket in the AWS console and set the name here - { name: 'STORAGE_BUCKET', value: s3Config.require('bucket') }, - { name: 'AUTH_JWT_ISSUER', value: 'app_starter' }, - { name: 'AUTH_JWT_COOKIE_NAME', value: 'access_token' }, - { name: 'AUTH_SALT_ROUNDS', value: '10' }, - { name: 'EMAIL_HOST', value: emailConfig.require('host') }, - { name: 'EMAIL_SSL', value: 'true' }, - { name: 'EMAIL_SENDER_NAME', value: 'App' }, - { name: 'EMAIL_SENDER_ADDRESS', value: emailConfig.require('senderAddress') }, - { name: 'AI_MODEL_ID', value: aiConfig.require('modelId') }, - { name: 'NUXT_PUBLIC_OIDC_ENABLED', value: oidcConfg.require('enabled') }, - { - name: 'NUXT_PUBLIC_OIDC_LOGIN_TEXT', - value: oidcConfg.require('loginText'), - }, - { name: 'OIDC_ALLOW_SIGNUP', value: oidcConfg.require('allowSignup') }, - { name: 'OIDC_DEFAULT_ROLE', value: oidcConfg.require('defaultRole') }, - { name: 'OIDC_ISSUER', value: oidcConfg.require('issuer') }, - { name: 'OIDC_JWKS_URL', value: oidcConfg.require('jwksUrl') }, - { - name: 'OIDC_AUTHORIZATION_ENDPOINT', - value: oidcConfg.require('authorizationEndpoint'), - }, - { name: 'OIDC_TOKEN_ENDPOINT', value: oidcConfg.require('tokenEndpoint') }, - { - name: 'OIDC_USERINFO_ENDPOINT', - value: oidcConfg.require('userinfoEndpoint'), - }, - { - name: 'NUXT_PUBLIC_OIDC_LOGOUT_ENABLED', - value: oidcConfg.require('logoutEnabled'), - }, - { name: 'OIDC_LOGOUT_ENDPOINT', value: oidcConfg.require('logoutEndpoint') }, - { - name: 'OIDC_POST_LOGOUT_URI_KEY', - value: oidcConfg.require('postLogoutUriKey'), - }, + { name: 'DATABASE_USERNAME', value: db.instance.username }, + { name: 'DATABASE_SSL', value: 'true' }, + { name: 'DATABASE_LOGGING', value: 'false' }, + // Authentication configuration + { name: 'AUTH_JWT_ISSUER', value: 'App' }, + { name: 'AUTH_JWT_EXPIRES_IN', value: '7d' }, + { name: 'AUTH_COOKIE_NAME', value: 'access_token' }, + { name: 'AUTH_SALT_ROUNDS', value: '12' }, + // Mail configuration + { name: 'MAIL_HOST', value: mailConfig.require('host') }, + { name: 'MAIL_PORT', value: '587' }, + { name: 'MAIL_SECURE', value: 'true' }, + { name: 'MAIL_FROM_NAME', value: 'App' }, + { name: 'MAIL_FROM_EMAIL', value: mailConfig.require('senderAddress') }, ]; export const getSecrets = (db: studion.Database) => [ ...[ 'AUTH_JWT_SECRET', - 'AUTH_JWT_COOKIE_SECRET', - 'STORAGE_KEY', - 'STORAGE_SECRET', - 'EMAIL_USER', - 'EMAIL_PASSWORD', - 'AI_SECRET_KEY', - 'OIDC_CLIENT_ID', - 'OIDC_CLIENT_SECRET', - 'OIDC_SESSION_SECRET', + 'MAIL_USER', + 'MAIL_PASSWORD', + 'SENTRY_DSN', ].map((name) => ({ name, valueFrom: getSsmParam(name) })), { name: 'DATABASE_PASSWORD', valueFrom: db.password.secret.arn }, ]; diff --git a/infrastructure/src/index.ts b/infrastructure/src/index.ts index 886f6c9..05aadc2 100644 --- a/infrastructure/src/index.ts +++ b/infrastructure/src/index.ts @@ -31,8 +31,8 @@ const vpc = new awsx.ec2.Vpc(`${PROJECT_NAME}-vpc`, { const db = new studion.Database(`${fullPrefix}-app-starter-db`, { instanceClass: 'db.t4g.micro', - dbName: 'app_starter', - username: 'app_starter', + dbName: 'odma', + username: 'odma', vpcId: vpc.vpcId, vpcCidrBlock: vpc.vpc.cidrBlock, isolatedSubnetIds: vpc.isolatedSubnetIds, diff --git a/package.json b/package.json index 5c7af34..be54fad 100644 --- a/package.json +++ b/package.json @@ -7,44 +7,50 @@ "dev": "node ./scripts/boot.js", "dc": "docker compose -f docker-compose.dev.yaml up & pnpm dev", "build": "dotenv -- pnpm -r build", - "start": "cd ./apps/backend && pnpm start", + "start": "cd ./apps/backend && pnpm start:prod", "dcs": "docker compose -f docker-compose.dev.yaml up & pnpm start", "lint": "eslint .", - "seed": "cd ./apps/backend && pnpm db:seed", + "seed": "cd ./apps/backend && pnpm seeder:run", + "openapi:generate": "cd apps/backend && pnpm build && pnpm openapi:generate", + "api:client:build": "node ./packages/api-client-generator/bin/build-client.js", + "api:client:watch": "node ./packages/api-client-generator/bin/watch-client.js", "e2e:functional": "cd tests && pnpm e2e:functional", "e2e:visual": "cd tests && pnpm e2e:visual", "e2e:a11y": "cd tests && pnpm e2e:a11y", "setup:dev": "pnpm i && node ./scripts/setup/index.js", "db:migrate": "cd ./apps/backend && pnpm db migrate", - "db:reset": "cd ./apps/backend && pnpm db:reset", + "db:reset": "cd ./apps/backend && pnpm schema:fresh", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs" }, "devDependencies": { "@app/seed": "workspace:^", - "@nuxt/eslint-config": "^0.6.1", + "@nuxt/eslint-config": "^1.9.0", "boxen": "^8.0.1", - "chalk": "^5.3.0", - "dotenv-cli": "^7.4.2", - "eslint": "^9.14.0", - "execa": "^9.5.1", - "inquirer": "^9.2.23", + "chalk": "^5.6.2", + "dotenv-cli": "^10.0.0", + "eslint": "^9.37.0", + "execa": "^9.6.0", + "inquirer": "^12.9.6", "lodash": "^4.17.21", + "massimo": "^1.0.1", + "massimo-cli": "^1.0.1", "minimist": "^1.2.8", - "ora": "^8.1.1", - "pg": "^8.13.1", - "pid-port": "^1.0.0", - "pkg-dir": "^8.0.0", - "shelljs": "^0.8.5", - "typescript": "^5.6.3", - "vitepress": "^1.5.0" + "ora": "^9.0.0", + "pg": "^8.16.3", + "pid-port": "^2.0.0", + "pkg-dir": "^9.0.0", + "prettier": "^3.6.2", + "shelljs": "^0.10.0", + "typescript": "^5.9.3", + "vitepress": "^1.6.4" }, "dependencies": { - "@inquirer/select": "^2.4.7", - "concurrently": "^9.1.0", - "dotenv": "^16.4.5", + "@inquirer/select": "^4.3.4", + "concurrently": "^9.2.1", + "dotenv": "^17.2.3", "fkill": "^9.0.0" }, - "packageManager": "pnpm@9.0.6+sha512.f6d863130973207cb7a336d6b439a242a26ac8068077df530d6a86069419853dc1ffe64029ec594a9c505a3a410d19643c870aba6776330f5cfddcf10a9c1617" + "packageManager": "pnpm@10.18.2" } diff --git a/packages/api-client-generator/README.md b/packages/api-client-generator/README.md new file mode 100644 index 0000000..ea12e8b --- /dev/null +++ b/packages/api-client-generator/README.md @@ -0,0 +1,383 @@ +# API Client Generator + +A TypeScript-first API client generator that creates axios-based clients from +OpenAPI specifications. Built specifically for NestJS backends with automatic +type inference and response handling. + +## Purpose + +This generator creates fully-typed, axios-based API clients that: +- **Auto-generate from OpenAPI specs** - No manual API client maintenance +- **Preserve full type safety** - Request/response types inferred from your DTOs +- **Handle response formats** - Works with NestJS `SuccessResponse` wrappers +- **Support multiple patterns** - Both data extraction and raw response access +- **Enable hot-reloading** - Watch OpenAPI changes and regenerate instantly + +## Core Principles + +### 1. **Type Safety First** + +All request and response types are automatically inferred from your OpenAPI +specification, eliminating manual type definitions and ensuring consistency +with your backend. + +### 2. **Response Format Awareness** + +Understands NestJS response patterns like `SuccessResponse` and +automatically extracts the data while preserving error handling. + +### 3. **Dual Access Patterns** + +- **Data extraction**: `api.users.getUser()` returns the unwrapped data +- **Raw access**: `api.users.getUser.raw()` returns the full axios response + +### 4. **Namespace Organization** + +Groups methods by OpenAPI operation IDs +(e.g., `users_getUser` โ†’ `api.users.getUser`) + +### 5. **Zero Configuration** + +Works out-of-the-box with monorepo structure detection and sensible defaults. + +## Usage + +### Generate API Client + +```bash +# Generate from auto-detected OpenAPI spec +pnpm api:client:build + +# Generate from specific spec file +pnpm api:client:build --spec ./custom-spec.json + +# Generate to custom output directory +pnpm api:client:build --output ./my-api-client + +# Watch for changes and auto-regenerate +pnpm api:client:watch +``` + +### Using the Generated Client + +```typescript +import { createApiClient } from 'app-api-client'; +import axiosClient from './request'; // Your configured axios instance + +// Create the API client +const api = await createApiClient({ axiosClient }); + +// Now use the fully-typed client +const userData = await api.auth.login({ + body: { email: 'user@example.com', password: 'password123' }, +}); +``` + +## Examples + +### Authentication + +```typescript +// Login +const loginResult = await api.auth.login({ + body: { + email: 'user@example.com', + password: 'password123', + }, +}); +// Type: SuccessResponse<{ user: UserDto; authData: AuthDataDto }> +console.log(loginResult.user.id, loginResult.authData.token); + +// Register +const newUser = await api.auth.register({ + body: { + email: 'newuser@example.com', + password: 'password123', + firstName: 'John', + lastName: 'Doe', + }, +}); +// Type: SuccessResponse + +// Logout +await api.auth.logout(); + +// Get current user +const currentUser = await api.auth.me(); +// Type: SuccessResponse +``` + +### User CRUD Operations + +```typescript +// Get all users (with pagination) +const users = await api.users.getUsers({ + query: { + page: 1, + limit: 10, + search: 'john', + }, +}); +// Type: SuccessResponse<{ users: UserDto[]; pagination: PaginationDto }> + +// Get specific user +const user = await api.users.getUser({ + path: { id: '123e4567-e89b-12d3-a456-426614174000' }, +}); +// Type: SuccessResponse + +// Create user +const newUser = await api.users.createUser({ + body: { + email: 'admin@example.com', + firstName: 'Admin', + lastName: 'User', + role: 'admin', + }, +}); +// Type: SuccessResponse + +// Update user +const updatedUser = await api.users.updateUser({ + path: { id: user.id }, + body: { + firstName: 'Updated Name', + lastName: 'Updated Last', + }, +}); +// Type: SuccessResponse + +// Delete user +await api.users.deleteUser({ + path: { id: user.id }, +}); +// Type: SuccessResponse +``` + +### Raw Response Access + +When you need access to status codes, headers, or full response data: + +```typescript +// Get raw axios response +const rawResponse = await api.users.getUser.raw({ + path: { id: '123' }, +}); + +console.log(rawResponse.status); // 200 +console.log(rawResponse.headers); // Full headers object +console.log(rawResponse.data); // Raw response body + +// Handle different status codes +if (rawResponse.status === 200) { + const userData = rawResponse.data.data; // Extract from SuccessResponse +} +``` + +### Error Handling + +```typescript +try { + const user = await api.users.getUser({ + path: { id: 'invalid-id' }, + }); +} catch (error) { + // Error automatically includes structured error details + console.log(error.message); // Human-readable message + console.log(error.code); // Error code from backend + console.log(error.type); // Error type + console.log(error.details); // Additional error details + console.log(error.meta); // Response metadata +} +``` + +### Advanced Query Parameters + +```typescript +// Complex filtering and sorting +const filteredUsers = await api.users.getUsers({ + query: { + page: 2, + limit: 25, + sortBy: 'createdAt', + sortOrder: 'desc', + filters: { + role: 'admin', + isActive: true, + createdAfter: '2024-01-01', + }, + }, +}); +``` + +## Response Data Extraction + +The client automatically extracts data from NestJS response wrappers: + +```typescript +// Backend returns: { success: true, data: UserDto, meta: { timestamp: ... } } +const user = await api.users.getUser({ path: { id: '123' } }); +// user is typed as UserDto (data extracted automatically) + +// To access the full response structure: +const fullResponse = await api.users.getUser.raw({ path: { id: '123' } }); +// fullResponse.data contains the complete { success, data, meta } object +``` + +## Configuration + +### CLI Options + +```bash +# Specify custom OpenAPI spec location +--spec, -s Path to OpenAPI spec file (default: auto-detected) + +# Specify custom output directory +--output, -o Output directory (default: packages/app-api-client) + +# Enable verbose logging +--verbose, -v Show detailed generation logs + +# Show help +--help, -h Display help information +``` + +### Monorepo Integration + +The generator automatically detects your monorepo structure: + +- **Root detection**: Finds monorepo root using `package.json` +- **Spec location**: Auto-locates OpenAPI spec from backend +- **Output path**: Defaults to `packages/app-api-client` + +## Generated Files + +``` +packages/app-api-client/ +โ”œโ”€โ”€ index.mjs # Main client code +โ”œโ”€โ”€ index.d.ts # TypeScript definitions +โ””โ”€โ”€ spec.openapi.json # OpenAPI spec copy +``` + +## Type Safety Features + +### Request Types + +All request parameters are typed based on your OpenAPI spec: + +- **Path parameters**: `{ path: { id: string } }` +- **Query parameters**: `{ query: { page?: number; limit?: number } }` +- **Request body**: `{ body: CreateUserDto }` + +### Response Types + +Response types are automatically inferred from your DTOs: + +- **Success responses**: Typed as your DTO (e.g., `UserDto`) +- **Error responses**: Structured error objects with message, code, type +- **Pagination**: Automatic pagination metadata typing + +### Namespace Safety + +Methods are organized into namespaces based on your controller structure: + +- `api.auth.*` - Authentication endpoints +- `api.users.*` - User management endpoints + +## Development Workflow + +1. **Modify your NestJS controllers/DTOs** +2. **OpenAPI spec updates automatically** (in dev mode) +3. **API client regenerates automatically** (in dev mode) +4. **Frontend gets new types immediately** - no manual updates needed + +## Advanced Usage + +### Custom Axios Configuration + +```typescript +import axios from 'axios'; +import { createApiClient } from 'app-api-client'; + +// Configure axios with interceptors, auth, etc. +const axiosClient = axios.create({ + baseURL: '/api', + timeout: 10000, +}); + +// Add auth interceptor +axiosClient.interceptors.request.use((config) => { + const token = localStorage.getItem('authToken'); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; +}); + +// Create API client with configured axios +const api = await createApiClient({ axiosClient }); +``` + +### Response Interceptors + +```typescript +// Handle common response patterns +axiosClient.interceptors.response.use( + (response) => response, + (error) => { + if (error.response?.status === 401) { + // Handle unauthorized access + window.location.href = '/login'; + } + return Promise.reject(error); + }, +); +``` + +## Troubleshooting + +### Common Issues + +**Client not updating after backend changes:** + +- Ensure OpenAPI spec is regenerated: `pnpm openapi:generate` +- Regenerate client: `pnpm api:client:build` + +**Type errors in IDE:** + +- Restart TypeScript service in your editor +- Check that `app-api-client` is properly imported + +**Build failures:** + +- Ensure backend is built first: `cd apps/backend && pnpm build` +- Check OpenAPI spec is valid JSON + +### Debug Mode + +```bash +# Enable verbose logging to see detailed generation process +pnpm api:client:build --verbose +``` + +## Architecture + +The generator follows a modular architecture: + +- **OpenAPI Parser**: Extracts operations and types from spec +- **Code Generator**: Creates axios-based client methods +- **Type Generator**: Generates TypeScript definitions +- **Template System**: Uses common-tags for clean code generation +- **Config System**: Centralized configuration with PascalCase properties +- **Root Finder**: Automatic monorepo structure detection + +## Contributing + +The generator is part of your monorepo. To modify or extend: + +1. **Core logic**: `packages/api-client-generator/src/lib/` +2. **Templates**: `packages/api-client-generator/src/lib/template-helpers.js` +3. **CLI**: `packages/api-client-generator/bin/` + +All changes should maintain TypeScript compatibility and follow the existing +code patterns. diff --git a/packages/api-client-generator/bin/build-client.js b/packages/api-client-generator/bin/build-client.js new file mode 100755 index 0000000..afc8b33 --- /dev/null +++ b/packages/api-client-generator/bin/build-client.js @@ -0,0 +1,55 @@ +import { join, isAbsolute } from 'node:path'; +import { execSync } from 'node:child_process'; +import { existsSync } from 'node:fs'; + +import { getDefaultPaths, resolveFromRoot } from '../src/lib/root-finder.js'; +import { createCliParser } from '../src/lib/cli-parser.js'; +import { generateAxiosClient } from '../src/index.js'; + +async function buildApiClient() { + const cliParser = createCliParser(); + + if (cliParser.shouldShowHelp()) { + cliParser.printHelp('build-client'); + return; + } + + const args = cliParser.getArgs(); + const defaultPaths = await getDefaultPaths(); + + const specPath = args.spec + ? isAbsolute(args.spec) + ? args.spec + : await resolveFromRoot(args.spec) + : defaultPaths.backendOpenApiPath; + + // Check if spec exists, try to generate if not + if (!existsSync(specPath)) { + console.log(`๐Ÿ“„ OpenAPI spec not found at: ${specPath}`); + console.log('๐Ÿ’ก Please generate openapi spec first'); + process.exit(1); + } + + // Copy spec to target location if using default behavior + if (!args.spec) { + const targetDir = args.output + ? isAbsolute(args.output) + ? args.output + : await resolveFromRoot(args.output) + : defaultPaths.clientDir; + + const targetSpecPath = join(targetDir, 'spec.openapi.json'); + execSync(`cp "${specPath}" "${targetSpecPath}"`, { stdio: 'inherit' }); + } + + await generateAxiosClient({ + specPath: args.spec || join(defaultPaths.clientDir, 'spec.openapi.json'), + outputDir: args.output, + verbose: args.verbose, + }); +} + +buildApiClient().catch((error) => { + console.error('โŒ Error building API client:', error); + process.exit(1); +}); diff --git a/packages/api-client-generator/bin/watch-client.js b/packages/api-client-generator/bin/watch-client.js new file mode 100755 index 0000000..1e040b9 --- /dev/null +++ b/packages/api-client-generator/bin/watch-client.js @@ -0,0 +1,113 @@ +import { spawn } from 'node:child_process'; +import { isAbsolute } from 'node:path'; +import { watch } from 'chokidar'; +import debounce from 'lodash/debounce.js'; + +import { createCliParser } from '../src/lib/cli-parser.js'; +import { getConfig } from '../src/lib/config.js'; +import { resolveFromRoot } from '../src/lib/root-finder.js'; + +let isGenerating = false; +let config; +let cliArgs; +let specPath; + +async function generateClient() { + if (isGenerating) { + console.log('โณ Generation already in progress, skipping...'); + return; + } + isGenerating = true; + console.log('๐Ÿ”„ Regenerating API client...'); + + // Use the root package.json script + const process = spawn('pnpm', ['api:client:build'], { + stdio: 'inherit', + shell: true, + cwd: config.RootDir, + }); + + return new Promise((resolve) => { + process.on('close', (code) => { + isGenerating = false; + if (code === 0) { + console.log('โœ… API client regenerated successfully'); + } else { + console.error('โŒ Failed to regenerate API client'); + } + resolve(); + }); + }); +} + +// Main function +async function watchApiClient() { + const cliParser = createCliParser(); + if (cliParser.shouldShowHelp()) { + cliParser.printHelp('watch-client'); + return; + } + + cliArgs = cliParser.getArgs(); + + // Initialize config to get paths + const configOverrides = {}; + if (cliArgs.output) { + configOverrides.ClientDir = isAbsolute(cliArgs.output) + ? cliArgs.output + : await resolveFromRoot(cliArgs.output); + } + config = await getConfig(configOverrides); + + // Determine spec path to watch + if (cliArgs.spec) { + specPath = isAbsolute(cliArgs.spec) + ? cliArgs.spec + : await resolveFromRoot(cliArgs.spec); + } else { + // Use default spec path or backend generated spec + specPath = config.BackendOpenApiPath; + } + + // Debounce to avoid multiple rapid regenerations + const debouncedRegenerate = debounce(generateClient, 1000); + + console.log('๐Ÿš€ Starting API client watcher...'); + console.log(`๐Ÿ“ Monorepo root: ${config.RootDir}`); + console.log(`๐Ÿ‘€ Watching OpenAPI spec: ${specPath}`); + console.log(`๐Ÿ“‚ Output directory: ${config.ClientDir}`); + console.log(''); + + const watcher = watch(specPath, { + ignored: /node_modules/, + persistent: true, + ignoreInitial: true, + }); + + watcher + .on('change', () => { + console.log(`๐Ÿ“ OpenAPI spec changed: ${specPath}`); + debouncedRegenerate(); + }) + .on('add', () => { + console.log(`โž• OpenAPI spec created: ${specPath}`); + debouncedRegenerate(); + }) + .on('unlink', () => { + console.log(`โž– OpenAPI spec removed: ${specPath}`); + console.log('โš ๏ธ API client generation stopped - spec file missing'); + }); + + // Handle graceful shutdown + process.on('SIGINT', () => { + console.log('\n๐Ÿ‘‹ Stopping API client watcher...'); + watcher.close(); + process.exit(0); + }); +} + +// Run the watcher +watchApiClient().catch((error) => { + console.error('โŒ Error starting watcher:', error.message); + process.exit(1); +}); diff --git a/packages/api-client-generator/package.json b/packages/api-client-generator/package.json new file mode 100644 index 0000000..e920b3a --- /dev/null +++ b/packages/api-client-generator/package.json @@ -0,0 +1,43 @@ +{ + "name": "api-client-generator", + "version": "1.0.0", + "description": "Generates API clients from OpenAPI specifications", + "type": "module", + "main": "src/index.js", + "bin": { + "build-client": "./bin/build-client.js", + "watch-client": "./bin/watch-client.js" + }, + "exports": { + ".": { + "import": "./src/index.js" + } + }, + "files": [ + "bin/", + "src/" + ], + "scripts": { + "build": "echo 'No build step required for this package'", + "test": "echo 'No tests defined yet'" + }, + "dependencies": { + "lodash": "^4.17.21", + "chokidar": "^4.0.3", + "package-up": "^5.0.0", + "minimist": "^1.2.8", + "common-tags": "^1.8.2" + }, + "keywords": [ + "api", + "client", + "generator", + "openapi", + "axios", + "nestjs" + ], + "license": "MIT", + "engines": { + "node": ">=18" + } +} diff --git a/packages/api-client-generator/src/generators/axios-client.js b/packages/api-client-generator/src/generators/axios-client.js new file mode 100644 index 0000000..3906362 --- /dev/null +++ b/packages/api-client-generator/src/generators/axios-client.js @@ -0,0 +1,137 @@ +import { join, isAbsolute } from 'node:path'; +import { CodeGenerator, OpenAPIParser, TypeGenerator } from '../index.js'; +import { + fileExists, + readJsonFile, + writeToFile, + formatGeneratedFiles, +} from '../lib/file-utils.js'; +import { getConfig } from '../lib/config.js'; +import { printSuccessMessage } from '../lib/template-helpers.js'; +import { resolveFromRoot } from '../lib/root-finder.js'; + +/** + * Main axios client generator + */ +export class AxiosClientGenerator { + constructor(options = {}) { + this.options = options; + this.config = null; + } + + /** + * Initialize the generator with config + */ + async initialize() { + const configOverrides = {}; + + if (this.options.outputDir) { + configOverrides.ClientDir = isAbsolute(this.options.outputDir) + ? this.options.outputDir + : await resolveFromRoot(this.options.outputDir); + } + + if (this.options.verbose) configOverrides.Verbose = true; + + this.config = await getConfig(configOverrides); + + if (this.options.specPath) { + this.openApiPath = isAbsolute(this.options.specPath) + ? this.options.specPath + : await resolveFromRoot(this.options.specPath); + } else { + this.openApiPath = join(this.config.ClientDir, this.config.SpecFilename); + } + + // Log configuration if verbose + if (this.config.Verbose) { + console.log(this.config.Messages.RootDetected, this.config.RootDir); + console.log(this.config.Messages.UsingSpec, this.openApiPath); + console.log(this.config.Messages.OutputDir, this.config.ClientDir); + } + } + + /** + * Validate prerequisites + */ + validatePrerequisites() { + if (fileExists(this.openApiPath)) return; + console.error(this.config.Messages.SpecNotFound); + console.error(`Spec path: ${this.openApiPath}`); + console.error(this.config.Messages.SpecNotFoundHelp); + process.exit(1); + } + + /** + * Generate the complete axios client + */ + async generate() { + await this.initialize(); + this.validatePrerequisites(); + + try { + console.log(this.config.Messages.Generating); + + // Parse OpenAPI spec + const spec = await readJsonFile(this.openApiPath); + const parser = new OpenAPIParser(spec); + const codeGenerator = new CodeGenerator(parser); + const typeGenerator = new TypeGenerator(parser); + + // Extract operations and namespaces + const operations = parser.getOperations(); + const namespaces = parser.getNamespaces(operations); + + // Generate client code + const clientCode = codeGenerator.generateClientCode( + operations, + namespaces, + ); + + await writeToFile( + join(this.config.ClientDir, this.config.ClientJsFile), + clientCode, + ); + + // Generate TypeScript definitions + const typeDefinitions = typeGenerator.generateTypeDefinitions( + operations, + namespaces, + ); + + await writeToFile( + join(this.config.ClientDir, this.config.ClientTypesFile), + typeDefinitions, + ); + + // Format generated files + await formatGeneratedFiles(); + + // Success message + printSuccessMessage( + operations, + namespaces, + this.config.ClientDir, + this.config, + ); + } catch (error) { + console.error(this.config.Messages.Error, error.message); + process.exit(1); + } + } +} + +/** + * Main generation function with CLI options support + */ +export async function generateAxiosClient(options = {}) { + const generator = new AxiosClientGenerator(options); + await generator.generate(); +} + +// Run if called directly +if (process.argv[1] === import.meta.url.slice(7)) { + generateAxiosClient(); +} + +export default { AxiosClientGenerator, generateAxiosClient }; diff --git a/packages/api-client-generator/src/index.js b/packages/api-client-generator/src/index.js new file mode 100644 index 0000000..6ee5cfc --- /dev/null +++ b/packages/api-client-generator/src/index.js @@ -0,0 +1,8 @@ +export { + AxiosClientGenerator, + generateAxiosClient, +} from './generators/axios-client.js'; + +export { OpenAPIParser } from './lib/openapi-parser.js'; +export { CodeGenerator } from './lib/code-generator.js'; +export { TypeGenerator } from './lib/type-generator.js'; diff --git a/packages/api-client-generator/src/lib/cli-parser.js b/packages/api-client-generator/src/lib/cli-parser.js new file mode 100644 index 0000000..2d2d885 --- /dev/null +++ b/packages/api-client-generator/src/lib/cli-parser.js @@ -0,0 +1,96 @@ +import minimist from 'minimist'; +import { stripIndent } from 'common-tags'; + +/** + * CLI argument parser using minimist + */ +export class CliParser { + constructor(argv = process.argv.slice(2)) { + this.argv = argv; + this.args = this.parse(); + } + + parse() { + const parsed = minimist(this.argv, { + string: ['spec', 'output', 'config'], + boolean: ['help', 'verbose'], + alias: { + s: 'spec', + o: 'output', + c: 'config', + h: 'help', + v: 'verbose', + }, + default: { + help: false, + verbose: false, + spec: null, + output: null, + config: null, + }, + }); + + return { + spec: parsed.spec, + output: parsed.output, + config: parsed.config, + help: parsed.help, + verbose: parsed.verbose, + }; + } + + /** + * Get parsed arguments + */ + getArgs() { + return this.args; + } + + /** + * Check if help was requested + */ + shouldShowHelp() { + return this.args.help; + } + + printHelp(commandName = 'api-client-generator') { + console.log(stripIndent` + Usage: ${commandName} [options] + Generate API client from OpenAPI specification + Options: + -s, --spec Path to OpenAPI spec file (JSON) + Default: auto-detected from monorepo structure + + -o, --output Output directory for generated client + Default: packages/app-api-client + + -c, --config Path to configuration file + Default: built-in configuration + + -v, --verbose Enable verbose output + + -h, --help Show this help message + + Examples: + ${commandName} + ${commandName} --spec ./custom-spec.json + ${commandName} --spec=./custom-spec.json + ${commandName} --spec ./spec.json --output ./generated-client + ${commandName} --verbose + + Environment: + The generator automatically detects the monorepo root using package.json + and resolves paths relative to that root unless absolute paths are + provided. + `); + } +} + +/** + * Create CLI parser instance + */ +export function createCliParser(argv) { + return new CliParser(argv); +} + +export default CliParser; diff --git a/packages/api-client-generator/src/lib/code-generator.js b/packages/api-client-generator/src/lib/code-generator.js new file mode 100644 index 0000000..74a6b8f --- /dev/null +++ b/packages/api-client-generator/src/lib/code-generator.js @@ -0,0 +1,54 @@ +import { stripIndent } from 'common-tags'; +import { + generateResponseHelpers, + generateAxiosMethod, + generateClientHeader, + generateNamespaceInitializers, +} from './template-helpers.js'; + +export class CodeGenerator { + constructor(parser) { + this.parser = parser; + } + + generateAxiosMethods(operations) { + return operations.map((op) => generateAxiosMethod(op)).join('\n'); + } + + generateClientCode(operations, namespaces) { + const header = generateClientHeader(); + const nsInitializers = generateNamespaceInitializers(namespaces); + const axiosMethods = this.generateAxiosMethods(operations); + const responseHelpers = generateResponseHelpers(); + + return stripIndent` + ${header} + + export async function createApiClient(opts = {}) { + const { axiosClient, ...otherOpts } = opts; + + if (!axiosClient) { + throw new Error('axiosClient is required for API client'); + } + + ${responseHelpers} + + // Initialize namespace groups + const index = { + ${nsInitializers}${nsInitializers ? ',' : ''} + _axiosClient: axiosClient, + extractData, + extractFullResponse, + extractPaginationMeta + }; + + // Generate axios-based methods + ${axiosMethods} + return index; + } + + export default createApiClient;`; + } +} + +export default CodeGenerator; diff --git a/packages/api-client-generator/src/lib/config.js b/packages/api-client-generator/src/lib/config.js new file mode 100644 index 0000000..74bba8b --- /dev/null +++ b/packages/api-client-generator/src/lib/config.js @@ -0,0 +1,81 @@ +import { getDefaultPaths } from './root-finder.js'; + +// Default configuration - will be augmented with runtime paths +const DEFAULT_CONFIG = { + // Generated files + ClientJsFile: 'index.mjs', + ClientTypesFile: 'index.d.ts', + SpecFilename: 'spec.openapi.json', + // Generation settings + PrettierEnabled: true, + OperationIdDelimiter: '_', + // Messages + Messages: { + Generating: '๐Ÿ”„ Generating axios-based API client...', + Success: 'โœ… Axios-based API client generated successfully!', + Error: 'โŒ Error generating API client:', + SpecNotFound: 'โŒ OpenAPI spec not found.', + SpecNotFoundHelp: + '๐Ÿ’ก Try: --spec path/to/spec.json or generate with pnpm openapi:generate', + Formatted: 'โœจ Formatted', + FormatError: 'โš ๏ธ Could not format', + RootDetected: '๐Ÿ“ Monorepo root detected:', + UsingSpec: '๐Ÿ“„ Using OpenAPI spec:', + OutputDir: '๐Ÿ“‚ Output directory:', + }, +}; + +/** + * Configuration class that supports runtime overrides + */ +export class Config { + constructor() { + this._config = { ...DEFAULT_CONFIG }; + this._initialized = false; + } + + /** + * Initialize config with dynamic paths and overrides + */ + async initialize(overrides = {}) { + if (this._initialized) return this._config; + try { + // Get default paths from monorepo structure + const defaultPaths = await getDefaultPaths(); + this._config = { + ...DEFAULT_CONFIG, + ClientDir: defaultPaths.clientDir, + BackendOpenApiPath: defaultPaths.backendOpenApiPath, + RootDir: defaultPaths.root, + ...overrides, + }; + this._initialized = true; + return this._config; + } catch (error) { + throw new Error(`Failed to initialize config: ${error.message}`); + } + } + + get() { + if (!this._initialized) { + throw new Error('Config not initialized. Call initialize() first.'); + } + return this._config; + } + + getValue(key) { + return this.get()[key]; + } +} + +// Singleton instance +const config = new Config(); + +/** + * Initialize and get config with overrides + */ +export async function getConfig(overrides = {}) { + return config.initialize(overrides); +} + +export default config; diff --git a/packages/api-client-generator/src/lib/file-utils.js b/packages/api-client-generator/src/lib/file-utils.js new file mode 100644 index 0000000..301676e --- /dev/null +++ b/packages/api-client-generator/src/lib/file-utils.js @@ -0,0 +1,50 @@ +import { readFile, writeFile } from 'node:fs/promises'; +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; + +import prettier from 'prettier'; + +import Config from './config.js'; + +// Thin wrappers for future enhancements +export function fileExists(filePath) { + return existsSync(filePath); +} + +export async function readJsonFile(filePath) { + const content = await readFile(filePath, 'utf-8'); + return JSON.parse(content); +} + +export async function writeToFile(filePath, content) { + await writeFile(filePath, content); +} + +export async function formatGeneratedFiles() { + if (!Config.PrettierEnabled) return; + const files = [ + join(Config.ClientDir, Config.ClientJsFile), + join(Config.ClientDir, Config.ClientTypesFile), + ]; + for (const filepath of files) { + if (!fileExists(filepath)) continue; + try { + const content = await readFile(filepath, 'utf-8'); + const formatted = await prettier.format(content, { + filepath, + ...(await prettier.resolveConfig(filepath)), + }); + await writeFile(filepath, formatted); + console.log(`${Config.Messages.Formatted} ${filepath}`); + } catch (err) { + console.error(`${Config.Messages.FormatError} ${filepath}:`, err.message); + } + } +} + +export default { + fileExists, + readJsonFile, + writeToFile, + formatGeneratedFiles, +}; diff --git a/packages/api-client-generator/src/lib/openapi-parser.js b/packages/api-client-generator/src/lib/openapi-parser.js new file mode 100644 index 0000000..e812c7e --- /dev/null +++ b/packages/api-client-generator/src/lib/openapi-parser.js @@ -0,0 +1,155 @@ +import camelCase from 'lodash/camelCase.js'; + +export class OpenAPIParser { + constructor(spec) { + this.spec = spec; + this.schemas = spec.components?.schemas || {}; + this.paths = spec.paths || {}; + } + + getOperations() { + const operations = []; + for (const [path, methods] of Object.entries(this.paths)) { + for (const [httpMethod, operation] of Object.entries(methods)) { + if (!operation.operationId) continue; + const parts = operation.operationId.split('_'); + if (parts.length < 2) continue; + const namespace = camelCase(parts[0]); + const method = camelCase(parts.slice(1).join('')); + operations.push({ + operationId: operation.operationId, + httpMethod: httpMethod.toUpperCase(), + path, + method, + namespace, + summary: operation.summary, + parameters: operation.parameters || [], + requestBody: operation.requestBody, + responses: operation.responses || {}, + operation, // Full operation object + }); + } + } + return operations; + } + + /** + * Get all unique namespaces + */ + getNamespaces(operations) { + return [...new Set(operations.map((op) => op.namespace))].sort(); + } + + /** + * Convert OpenAPI property to TypeScript type + */ + getPropertyType(prop) { + if (prop.$ref) return prop.$ref.split('/').pop(); + switch (prop.type) { + case 'string': + return prop.enum + ? prop.enum.map((v) => `'${v}'`).join(' | ') + : 'string'; + case 'number': + case 'integer': + return 'number'; + case 'boolean': + return 'boolean'; + case 'array': + return `Array<${this.getPropertyType(prop.items)}>`; + case 'object': + return 'object'; + default: + return 'any'; + } + } + + /** + * Generate TypeScript interfaces from schemas + */ + generateSchemaTypes() { + const typeDefinitions = []; + for (const [schemaName, schema] of Object.entries(this.schemas)) { + if (schema.type !== 'object') continue; + const properties = Object.entries(schema.properties || {}) + .map(([name, definition]) => { + const isRequired = schema.required?.includes(name) ?? false; + const optional = isRequired ? '' : '?'; + const type = this.getPropertyType(definition); + const description = definition.description + ? `\n /** ${definition.description} */` + : ''; + return `${description}\n ${name}${optional}: ${type};`; + }) + .join('\n'); + typeDefinitions.push( + `\nexport interface ${schemaName} {${properties}\n}`, + ); + } + return typeDefinitions.join('\n'); + } + + /** + * Extract request/response types for an operation + */ + getOperationTypes(operation) { + const requestParts = []; + // Path parameters + const pathParams = operation.parameters.filter((p) => p.in === 'path'); + if (pathParams.length > 0) { + const pathProps = pathParams.map((p) => `${p.name}: string`).join('; '); + requestParts.push(`path: {${pathProps}}`); + } + // Query parameters + const queryParams = operation.parameters.filter((p) => p.in === 'query'); + if (queryParams.length > 0) { + const queryProps = queryParams + .map((p) => { + const optional = p.required ? '' : '?'; + const type = this.getPropertyType(p.schema || { type: 'string' }); + return `${p.name}${optional}: ${type}`; + }) + .join('; '); + requestParts.push(`query?: {${queryProps}}`); + } + // Request body + if (operation.requestBody) { + const content = operation.requestBody.content?.['application/json']; + if (content?.schema) { + const bodyType = this.getPropertyType(content.schema); + requestParts.push(`body: ${bodyType}`); + } + } + let requestType = '{}'; + if (requestParts.length > 0) requestType = `{${requestParts.join('; ')}}`; + // Response type (prefer 200/201/202) + const responses = operation.responses; + const successResponse = + responses['200'] || responses['201'] || responses['202']; + let responseType = 'any'; + if (successResponse?.content?.['application/json']?.schema) { + const schemaRef = successResponse.content['application/json'].schema.$ref; + responseType = this.getPropertyType( + successResponse.content['application/json'].schema, + ); + // Handle paginated responses - ResponseInterceptor unwraps them + if (schemaRef) { + const schema = this.schemas[schemaRef.split('/').pop()]; + // Check if this is a paginated response + // (has data array and pagination fields) + if ( + schema?.properties?.data?.type === 'array' && + (schema.properties.total || + schema.properties.limit || + schema.properties.page) + ) { + // For paginated responses, the actual data type is the array inside + responseType = `Array<${this.getPropertyType(schema.properties.data.items)}>`; + } + } + } + return { requestType, responseType }; + } +} + +export default OpenAPIParser; diff --git a/packages/api-client-generator/src/lib/root-finder.js b/packages/api-client-generator/src/lib/root-finder.js new file mode 100644 index 0000000..9458f37 --- /dev/null +++ b/packages/api-client-generator/src/lib/root-finder.js @@ -0,0 +1,89 @@ +import { dirname, isAbsolute, join, resolve } from 'node:path'; +import { existsSync } from 'node:fs'; +import { packageUp } from 'package-up'; + +/** + * Dynamic root finder using package-up + */ +export class RootFinder { + constructor() { + this._cache = null; + } + + /** + * Find the monorepo root directory + */ + async findRoot(startDir = process.cwd()) { + if (this._cache) return this._cache; + try { + let currentDir = startDir; + let isRootFound = null; + while (!isRootFound) { + const pkgPath = await packageUp({ cwd: currentDir }); + if (!pkgPath) throw new Error(`Could not find package.json in parent`); + const rootDir = dirname(pkgPath); + const isMonorepo = existsSync(join(rootDir, 'pnpm-workspace.yaml')); + if (isMonorepo) { + isRootFound = rootDir; + break; + } + // Move up one level and try again + const parentDir = dirname(rootDir); + if (parentDir === rootDir) { + // We've reached the filesystem root + // Fall back to the first package.json we found + console.warn( + `โš ๏ธ Warning: Monorepo structure not detected, using: ${rootDir}`, + ); + isRootFound = rootDir; + break; + } + currentDir = parentDir; + } + this._cache = isRootFound; + return isRootFound; + } catch (error) { + throw new Error(`Failed to find monorepo root: ${error.message}`); + } + } + + /** + * Resolve a path relative to the monorepo root + */ + async resolvePath(relativePath, startDir = process.cwd()) { + if (isAbsolute(relativePath)) return relativePath; + const root = await this.findRoot(startDir); + return resolve(root, relativePath); + } + + /** + * Get default paths based on monorepo structure + */ + async getDefaultPaths(startDir = process.cwd()) { + const root = await this.findRoot(startDir); + return { + root, + clientDir: join(root, 'packages/app-api-client'), + backendOpenApiPath: join(root, 'apps/backend/openapi.json'), + }; + } +} + +// Singleton instance +const rootFinder = new RootFinder(); + +/** + * Resolve path relative to monorepo root + */ +export async function resolveFromRoot(relativePath, startDir) { + return rootFinder.resolvePath(relativePath, startDir); +} + +/** + * Get default paths for the monorepo + */ +export async function getDefaultPaths(startDir) { + return rootFinder.getDefaultPaths(startDir); +} + +export default RootFinder; diff --git a/packages/api-client-generator/src/lib/template-helpers.js b/packages/api-client-generator/src/lib/template-helpers.js new file mode 100644 index 0000000..a749d43 --- /dev/null +++ b/packages/api-client-generator/src/lib/template-helpers.js @@ -0,0 +1,230 @@ +import { stripIndent } from 'common-tags'; + +// Template helpers for code generation +export function generateResponseHelpers() { + return stripIndent` + // Helper to extract full response + function extractFullResponse(res) { + return res?.data || {}; + } + + // Helper to extract data from API response format + function extractData(res) { + const response = extractFullResponse(res); + if (response.success && response.data !== undefined) return response.data; + // Handle error responses + if (!response.success && response.error) { + const error = new Error(response.error.message || 'API Error'); + error.code = response.error.code; + error.type = response.error.type; + error.details = response.error.details; + error.meta = response.meta; + throw error; + } + // Return response directly if not in standard format + return response; + } + + // Helper to extract pagination info + function extractPaginationMeta(res) { + const response = extractFullResponse(res); + return response?.meta?.pagination || null; + } + + // Build axios request config from API client request + function buildAxiosConfig(request, path, method) { + const config = { + url: path, + method: method.toLowerCase(), + }; + if (request?.body) { + config.data = request.body; + } + if (request?.query) { + config.params = request.query; + } + if (request?.path) { + // Replace path parameters in URL + let finalPath = path; + for (const [key, value] of Object.entries(request.path)) { + finalPath = finalPath.replace(\`{\${key}}\`, encodeURIComponent(value)); + } + config.url = finalPath; + } + return config; + } + `; +} + +/** + * Generate a single axios method for an operation + */ +export function generateAxiosMethod(operation) { + const cleanPath = operation.path.startsWith('/api') + ? operation.path.substring('/api'.length) + : operation.path; + return stripIndent` + // ${operation.summary || 'No description'} + index.${operation.namespace}.${operation.method} = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '${cleanPath}', '${operation.httpMethod}'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } + }; + // Add raw method that returns full axios response + index.${operation.namespace}.${operation.method}.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '${cleanPath}', + '${operation.httpMethod}'); + return await axiosClient.request(axiosConfig); + }; + `; +} + +/** + * Generate the main client header comment + */ +export function generateClientHeader() { + return stripIndent` + /** + * Auto-generated axios-based API client + * Generated from: ${new Date().toISOString()} + * Usage: + * import { createApiClient } from 'app-api-client' + * const api = await createApiClient({ axiosClient }) + * const userData = await api.auth.login({ body: { email, password } }) + */`; +} + +/** + * Generate namespace initializers + */ +export function generateNamespaceInitializers(namespaces) { + if (namespaces.length === 0) return ''; + return namespaces.map((ns) => ` ${ns}: {}`).join(',\n'); +} + +/** + * Generate TypeScript definitions header + */ +export function generateTypeDefinitionsHeader() { + return stripIndent` + /** + * TypeScript definitions for axios-based API client + */ + import type { AxiosInstance, AxiosResponse } from 'axios';`; +} + +/** + * Generate base TypeScript interfaces + */ +export function generateBaseInterfaces() { + return stripIndent` + // Response wrapper interface + export interface ApiResponse { + statusCode: number; + headers: any; + body: { + success: boolean; + data: T; + meta?: { + pagination?: { + total: number; + limit: number; + page: number; + totalPages: number; + hasPrevious: boolean; + hasNext: boolean; + }; + }; + error?: any; + }; + data: T; + } + + // Raw method interface + export interface RawMethod { + (request?: TRequest): Promise>; + } + + // API method interface + export interface ApiMethod { + (request?: TRequest): Promise>; + raw: RawMethod; + } + + // Helper function interfaces + export interface ResponseHelpers { + extractData(res: AxiosResponse): any; + extractFullResponse(res: AxiosResponse): any; + extractPaginationMeta(res: AxiosResponse): any; + }`; +} + +/** + * Generate success message + */ +export function printSuccessMessage(operations, namespaces, clientDir, config) { + console.log(`\n${config.Messages.Success}`); + console.log('\n๐Ÿ“ Generated files:'); + console.log(` โ€ข ${clientDir}/${config.ClientJsFile} (axios-based client)`); + console.log(` โ€ข ${clientDir}/${config.ClientTypesFile} (TS definitions)`); + console.log('\n๐Ÿท๏ธ Namespaces created:'); + namespaces.forEach((ns) => { + const count = operations.filter((op) => op.namespace === ns).length; + console.log(` โ€ข ${ns} (${count} methods)`); + }); + console.log('\n๐Ÿ“š Usage example:'); + console.log(`import { createApiClient } from 'app-api-client';`); + console.log(`import axiosClient from './request';`); + console.log('const api = await createApiClient({ axiosClient });'); + console.log('await api.auth.login({ body: { email, password } });'); +} + +export default { + generateResponseHelpers, + generateAxiosMethod, + generateClientHeader, + generateNamespaceInitializers, + generateTypeDefinitionsHeader, + generateBaseInterfaces, + printSuccessMessage, +}; diff --git a/packages/api-client-generator/src/lib/type-generator.js b/packages/api-client-generator/src/lib/type-generator.js new file mode 100644 index 0000000..0d4a4cd --- /dev/null +++ b/packages/api-client-generator/src/lib/type-generator.js @@ -0,0 +1,92 @@ +#!/usr/bin/env node +import upperFirst from 'lodash/upperFirst.js'; +import { stripIndent } from 'common-tags'; + +import { + generateTypeDefinitionsHeader, + generateBaseInterfaces, +} from './template-helpers.js'; + +export class TypeGenerator { + constructor(parser) { + this.parser = parser; + } + + generateNamespaceInterfaces(operations, namespaces) { + return namespaces + .map((ns) => { + const methods = operations.filter((op) => op.namespace === ns); + const capitalNs = upperFirst(ns); + const methodDefinitions = methods + .map((op) => { + const { requestType, responseType } = + this.parser.getOperationTypes(op); + return stripIndent` + /** + * ${op.summary || 'No description'} + */ + ${op.method}: ApiMethod<${requestType}, ${responseType}>;`; + }) + .join('\n'); + + return stripIndent` + export interface ${capitalNs}Namespace { ${methodDefinitions} }`; + }) + .join('\n'); + } + + /** + * Generate main client interface + */ + generateMainInterface(namespaces) { + return namespaces + .map((ns) => ` ${ns}: ${upperFirst(ns)}Namespace;`) + .join('\n'); + } + + /** + * Generate client creation interfaces + */ + generateClientCreationInterfaces() { + return stripIndent` + // Client creation options + export interface CreateAcOpts { + axiosClient: AxiosInstance; + [key: string]: any; + } + export declare function createApiClient(opts: CreateAcOpts): Promise; + export default createApiClient;`; + } + + /** + * Generate complete TypeScript definitions + */ + generateTypeDefinitions(operations, namespaces) { + const schemaTypes = this.parser.generateSchemaTypes(); + const namespaceInterfaces = this.generateNamespaceInterfaces( + operations, + namespaces, + ); + const mainInterface = this.generateMainInterface(namespaces); + const baseInterfaces = generateBaseInterfaces(); + const clientCreationInterfaces = this.generateClientCreationInterfaces(); + + return stripIndent` + ${generateTypeDefinitionsHeader()} + + // Auto-generated schema types from OpenAPI spec${schemaTypes} + ${baseInterfaces} + + // Namespace interfaces + ${namespaceInterfaces} + + // Main client interface + export interface ApiClient extends ResponseHelpers { + ${mainInterface} + _axiosClient: AxiosInstance; + } + ${clientCreationInterfaces}`; + } +} + +export default TypeGenerator; diff --git a/packages/app-api-client/index.d.ts b/packages/app-api-client/index.d.ts new file mode 100644 index 0000000..12c33c6 --- /dev/null +++ b/packages/app-api-client/index.d.ts @@ -0,0 +1,294 @@ +/** + * TypeScript definitions for axios-based API client + */ +import type { AxiosInstance, AxiosResponse } from 'axios'; + + // Auto-generated schema types from OpenAPI spec +export interface LoginDto { + /** User email address */ + email: string; + + /** User password */ + password: string; +} + +export interface UserDto { + id: number; + + email: string; + + role: 'ADMIN' | 'USER'; + + firstName: string; + + lastName: string; + + fullName: string; + + label: string; + + imgUrl: string; + + createdAt: string; + + updatedAt: string; + + deletedAt: string; +} + +export interface LoginResponseDto { + user: UserDto; + + /** JWT access token */ + accessToken: string; + + /** Token expiration time in milliseconds */ + expiresInMs: number; +} + +export interface ChangePasswordDto { + /** Current password */ + currentPassword: string; + + /** New password */ + newPassword: string; +} + +export interface ChangePasswordResponseDto { + /** Success message */ + message: string; +} + +export interface ForgotPasswordDto { + /** Email address to send reset link to */ + email: string; +} + +export interface ResetPasswordDto { + /** Password reset token */ + token: string; + + /** New password */ + newPassword: string; +} + +export interface UpdateProfileDto { + /** User email address */ + email?: string; + + /** User first name */ + firstName?: string; + + /** User last name */ + lastName?: string; + + /** User avatar as data URL (base64 encoded image) */ + imgUrl?: string; +} + +export interface PaginatedUsersDto { + data: Array; + + /** Total number of items */ + total: number; + + /** Number of items per page */ + limit: number; + + /** Current page number */ + page: number; + + /** Total number of pages */ + totalPages: number; + + /** Has previous page */ + hasPrevious: boolean; + + /** Has next page */ + hasNext: boolean; +} + +export interface CreateUserDto { + /** User email address */ + email: string; + + /** User first name */ + firstName?: string; + + /** User last name */ + lastName?: string; + + /** User role */ + role?: 'ADMIN' | 'USER'; +} + +export interface UpdateUserDto { + /** User email address */ + email?: string; + + /** User first name */ + firstName?: string; + + /** User last name */ + lastName?: string; + + /** User avatar as data URL (base64 encoded image) */ + imgUrl?: string; + + /** User role (admin only) */ + role?: 'ADMIN' | 'USER'; +} + +export interface SeedResponseDto { + /** Result message */ + message: string; + + /** Response data */ + data?: object; +} + // Response wrapper interface +export interface ApiResponse { + statusCode: number; + headers: any; + body: { + success: boolean; + data: T; + meta?: { + pagination?: { + total: number; + limit: number; + page: number; + totalPages: number; + hasPrevious: boolean; + hasNext: boolean; + }; + }; + error?: any; + }; + data: T; +} + +// Raw method interface +export interface RawMethod { + (request?: TRequest): Promise>; +} + +// API method interface +export interface ApiMethod { + (request?: TRequest): Promise>; + raw: RawMethod; +} + +// Helper function interfaces +export interface ResponseHelpers { + extractData(res: AxiosResponse): any; + extractFullResponse(res: AxiosResponse): any; + extractPaginationMeta(res: AxiosResponse): any; +} + + // Namespace interfaces + export interface AuthNamespace { /** + * User login + */ +login: ApiMethod<{body: LoginDto}, LoginResponseDto>; +/** + * User logout + */ +logout: ApiMethod<{}, any>; +/** + * Change current password + */ +changePassword: ApiMethod<{body: ChangePasswordDto}, ChangePasswordResponseDto>; +/** + * Request password reset + */ +forgotPassword: ApiMethod<{body: ForgotPasswordDto}, any>; +/** + * Reset password with token + */ +resetPassword: ApiMethod<{body: ResetPasswordDto}, any>; +/** + * Validate reset token + */ +validateResetToken: ApiMethod<{}, any>; } +export interface CurrentUserNamespace { /** + * Get current user profile + */ +get: ApiMethod<{}, UserDto>; +/** + * Update user profile + */ +update: ApiMethod<{body: UpdateProfileDto}, UserDto>; } +export interface HealthNamespace { /** + * Basic health check + */ +healthCheck: ApiMethod<{}, any>; +/** + * Liveness probe + */ +liveness: ApiMethod<{}, any>; +/** + * Readiness probe + */ +readiness: ApiMethod<{}, any>; +/** + * Test Sentry error capture (development only) + */ +sentryDebug: ApiMethod<{}, any>; +/** + * Test Sentry message capture (development only) + */ +sentryMessage: ApiMethod<{}, any>; } +export interface SeedNamespace { /** + * Reset database with base seed data + */ +resetDatabase: ApiMethod<{}, SeedResponseDto>; +/** + * Create a single test user + */ +seedUser: ApiMethod<{}, SeedResponseDto>; } +export interface UserNamespace { /** + * List users (Admin only) + */ +fetch: ApiMethod<{query?: {email?: string; search?: string; includeArchived?: boolean; page?: number; limit?: number; sortBy?: 'id' | 'email' | 'firstName' | 'lastName' | 'createdAt' | 'updatedAt'; sortOrder?: 'ASC' | 'DESC'}}, Array>; +/** + * Create or invite user (Admin only) + */ +create: ApiMethod<{body: CreateUserDto}, UserDto>; +/** + * Get user by ID (Admin only) + */ +get: ApiMethod<{path: {id: string}}, UserDto>; +/** + * Update user by ID + */ +update: ApiMethod<{path: {id: string}; body: UpdateUserDto}, UserDto>; +/** + * Delete user (Admin only) + */ +remove: ApiMethod<{path: {id: string}}, any>; +/** + * Restore soft-deleted user (Admin only) + */ +restore: ApiMethod<{path: {id: string}}, UserDto>; +/** + * Reinvite user (Admin only) + */ +reinvite: ApiMethod<{path: {id: string}}, any>; } + + // Main client interface + export interface ApiClient extends ResponseHelpers { + auth: AuthNamespace; + currentUser: CurrentUserNamespace; + health: HealthNamespace; + seed: SeedNamespace; + user: UserNamespace; + _axiosClient: AxiosInstance; + } + // Client creation options +export interface CreateAcOpts { + axiosClient: AxiosInstance; + [key: string]: any; +} +export declare function createApiClient(opts: CreateAcOpts): Promise; +export default createApiClient; \ No newline at end of file diff --git a/packages/app-api-client/index.mjs b/packages/app-api-client/index.mjs new file mode 100644 index 0000000..081fb93 --- /dev/null +++ b/packages/app-api-client/index.mjs @@ -0,0 +1,1251 @@ +/** + * Auto-generated axios-based API client + * Generated from: 2025-10-15T12:02:19.394Z + * Usage: + * import { createApiClient } from 'app-api-client' + * const api = await createApiClient({ axiosClient }) + * const userData = await api.auth.login({ body: { email, password } }) + */ + + export async function createApiClient(opts = {}) { + const { axiosClient, ...otherOpts } = opts; + + if (!axiosClient) { + throw new Error('axiosClient is required for API client'); + } + + // Helper to extract full response +function extractFullResponse(res) { + return res?.data || {}; +} + +// Helper to extract data from API response format +function extractData(res) { + const response = extractFullResponse(res); + if (response.success && response.data !== undefined) return response.data; + // Handle error responses + if (!response.success && response.error) { + const error = new Error(response.error.message || 'API Error'); + error.code = response.error.code; + error.type = response.error.type; + error.details = response.error.details; + error.meta = response.meta; + throw error; + } + // Return response directly if not in standard format + return response; +} + +// Helper to extract pagination info +function extractPaginationMeta(res) { + const response = extractFullResponse(res); + return response?.meta?.pagination || null; +} + +// Build axios request config from API client request +function buildAxiosConfig(request, path, method) { + const config = { + url: path, + method: method.toLowerCase(), + }; + if (request?.body) { + config.data = request.body; + } + if (request?.query) { + config.params = request.query; + } + if (request?.path) { + // Replace path parameters in URL + let finalPath = path; + for (const [key, value] of Object.entries(request.path)) { + finalPath = finalPath.replace(`{${key}}`, encodeURIComponent(value)); + } + config.url = finalPath; + } + return config; +} + + // Initialize namespace groups + const index = { + auth: {}, + currentUser: {}, + health: {}, + seed: {}, + user: {}, + _axiosClient: axiosClient, + extractData, + extractFullResponse, + extractPaginationMeta + }; + + // Generate axios-based methods + // User login +index.auth.login = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/auth/login', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.auth.login.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/auth/login', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// User logout +index.auth.logout = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/auth/logout', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.auth.logout.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/auth/logout', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Change current password +index.auth.changePassword = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/auth/change-password', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.auth.changePassword.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/auth/change-password', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Request password reset +index.auth.forgotPassword = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/auth/forgot-password', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.auth.forgotPassword.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/auth/forgot-password', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Reset password with token +index.auth.resetPassword = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/auth/reset-password', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.auth.resetPassword.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/auth/reset-password', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Validate reset token +index.auth.validateResetToken = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/auth/reset-password/token-status', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.auth.validateResetToken.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/auth/reset-password/token-status', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Get current user profile +index.currentUser.get = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/me', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.currentUser.get.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/me', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Update user profile +index.currentUser.update = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/me', 'PATCH'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.currentUser.update.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/me', + 'PATCH'); + return await axiosClient.request(axiosConfig); +}; +// List users (Admin only) +index.user.fetch = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.fetch.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Create or invite user (Admin only) +index.user.create = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.create.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Get user by ID (Admin only) +index.user.get = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users/{id}', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.get.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users/{id}', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Update user by ID +index.user.update = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users/{id}', 'PATCH'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.update.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users/{id}', + 'PATCH'); + return await axiosClient.request(axiosConfig); +}; +// Delete user (Admin only) +index.user.remove = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users/{id}', 'DELETE'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.remove.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users/{id}', + 'DELETE'); + return await axiosClient.request(axiosConfig); +}; +// Restore soft-deleted user (Admin only) +index.user.restore = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users/{id}/restore', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.restore.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users/{id}/restore', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Reinvite user (Admin only) +index.user.reinvite = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/users/{id}/reinvite', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.user.reinvite.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/users/{id}/reinvite', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Basic health check +index.health.healthCheck = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/healthcheck', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.health.healthCheck.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/healthcheck', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Liveness probe +index.health.liveness = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/health/live', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.health.liveness.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/health/live', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Readiness probe +index.health.readiness = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/health/ready', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.health.readiness.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/health/ready', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Test Sentry error capture (development only) +index.health.sentryDebug = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/sentry/debug', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.health.sentryDebug.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/sentry/debug', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Test Sentry message capture (development only) +index.health.sentryMessage = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/sentry/message', 'GET'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.health.sentryMessage.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/sentry/message', + 'GET'); + return await axiosClient.request(axiosConfig); +}; +// Reset database with base seed data +index.seed.resetDatabase = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/seed/reset', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.seed.resetDatabase.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/seed/reset', + 'POST'); + return await axiosClient.request(axiosConfig); +}; +// Create a single test user +index.seed.seedUser = async (request = {}) => { + const axiosConfig = + buildAxiosConfig(request, '/seed/user', 'POST'); + try { + const response = await axiosClient.request(axiosConfig); + return { + statusCode: response.status, + headers: response.headers, + body: response.data, + data: extractData(response) + }; + } catch (err) { + // Debug: log the error structure + console.log('API Client Error:', { + hasResponse: !!err.response, + hasRequest: !!err.request, + status: err.response?.status, + message: err.message, + errorKeys: Object.keys(err) + }); + + // Handle axios errors (4xx, 5xx status codes) + if (err.response) { + return { + statusCode: err.response.status, + headers: err.response.headers || {}, + body: err.response.data, + data: err.response.data // Use raw error response data instead of extractData + }; + } + // Handle request errors (no response received) + if (err.request) { + return { + statusCode: 0, + headers: {}, + body: null, + data: { error: 'No response received from server' } + }; + } + // Re-throw other errors (network errors, etc.) + throw err; + } +}; +// Add raw method that returns full axios response +index.seed.seedUser.raw = + async (request = {}) => { + const axiosConfig = buildAxiosConfig( + request, + '/seed/user', + 'POST'); + return await axiosClient.request(axiosConfig); +}; + return index; + } + + export default createApiClient; \ No newline at end of file diff --git a/packages/app-api-client/package.json b/packages/app-api-client/package.json new file mode 100644 index 0000000..ec8fdfa --- /dev/null +++ b/packages/app-api-client/package.json @@ -0,0 +1,37 @@ +{ + "name": "app-api-client", + "version": "1.0.0", + "description": "Auto-generated API client for the app", + "type": "module", + "main": "index.mjs", + "types": "index.d.ts", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.mjs" + }, + "./response-dtos": { + "types": "./response-dtos.d.ts" + }, + "./typed-methods": { + "types": "./typed-methods.d.ts", + "import": "./typed-methods.js" + } + }, + "files": [ + "index.mjs", + "index.d.ts", + "api-client.mjs", + "api-client-types.d.ts", + "response-dtos.d.ts" + ], + "keywords": [ + "api", + "client", + "auto-generated" + ], + "license": "MIT", + "engines": { + "node": ">=18" + } +} diff --git a/packages/app-api-client/spec.openapi.json b/packages/app-api-client/spec.openapi.json new file mode 100644 index 0000000..1f314f6 --- /dev/null +++ b/packages/app-api-client/spec.openapi.json @@ -0,0 +1,1006 @@ +{ + "openapi": "3.0.0", + "paths": { + "/api/auth/login": { + "post": { + "operationId": "Auth_login", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginDto" + } + } + } + }, + "responses": { + "200": { + "description": "User logged in successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LoginResponseDto" + } + } + } + }, + "401": { + "description": "Invalid credentials" + } + }, + "summary": "User login", + "tags": [ + "auth" + ] + } + }, + "/api/auth/logout": { + "get": { + "operationId": "Auth_logout", + "parameters": [], + "responses": { + "200": { + "description": "User logged out successfully" + } + }, + "summary": "User logout", + "tags": [ + "auth" + ] + } + }, + "/api/auth/change-password": { + "post": { + "operationId": "Auth_changePassword", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePasswordDto" + } + } + } + }, + "responses": { + "200": { + "description": "Password changed successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChangePasswordResponseDto" + } + } + } + }, + "400": { + "description": "Current password is incorrect!" + } + }, + "summary": "Change current password", + "tags": [ + "auth" + ] + } + }, + "/api/auth/forgot-password": { + "post": { + "operationId": "Auth_forgotPassword", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ForgotPasswordDto" + } + } + } + }, + "responses": { + "200": { + "description": "Password reset email sent if user exists" + } + }, + "summary": "Request password reset", + "tags": [ + "auth" + ] + } + }, + "/api/auth/reset-password": { + "post": { + "operationId": "Auth_resetPassword", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResetPasswordDto" + } + } + } + }, + "responses": { + "204": { + "description": "Password reset successfully" + }, + "400": { + "description": "Invalid or expired token" + } + }, + "summary": "Reset password with token", + "tags": [ + "auth" + ] + } + }, + "/api/auth/reset-password/token-status": { + "post": { + "operationId": "Auth_validateResetToken", + "parameters": [], + "responses": { + "202": { + "description": "Token is valid" + } + }, + "summary": "Validate reset token", + "tags": [ + "auth" + ] + } + }, + "/api/me": { + "get": { + "operationId": "CurrentUser_get", + "parameters": [], + "responses": { + "200": { + "description": "Current user profile", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + } + }, + "summary": "Get current user profile", + "tags": [ + "me" + ] + }, + "patch": { + "operationId": "CurrentUser_update", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateProfileDto" + } + } + } + }, + "responses": { + "200": { + "description": "Updated user profile", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + } + }, + "summary": "Update user profile", + "tags": [ + "me" + ] + } + }, + "/api/users": { + "get": { + "operationId": "User_fetch", + "parameters": [ + { + "name": "email", + "required": false, + "in": "query", + "description": "Find by exact email", + "schema": { + "example": "admin@example.com", + "type": "string" + } + }, + { + "name": "search", + "required": false, + "in": "query", + "description": "Search term for email, first name, or last name", + "schema": { + "example": "john", + "type": "string" + } + }, + { + "name": "includeArchived", + "required": false, + "in": "query", + "description": "Include soft-deleted users", + "schema": { + "default": false, + "example": false, + "type": "boolean" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "Page number", + "schema": { + "minimum": 1, + "default": 1, + "type": "number" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "description": "Number of items per page", + "schema": { + "minimum": 1, + "maximum": 100, + "default": 20, + "type": "number" + } + }, + { + "name": "sortBy", + "required": false, + "in": "query", + "description": "Field to sort by", + "schema": { + "default": "createdAt", + "type": "string", + "enum": [ + "id", + "email", + "firstName", + "lastName", + "createdAt", + "updatedAt" + ] + } + }, + { + "name": "sortOrder", + "required": false, + "in": "query", + "description": "Sort order", + "schema": { + "default": "DESC", + "type": "string", + "enum": [ + "ASC", + "DESC" + ] + } + } + ], + "responses": { + "200": { + "description": "List of users", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUsersDto" + } + } + } + } + }, + "summary": "List users (Admin only)", + "tags": [ + "users" + ] + }, + "post": { + "operationId": "User_create", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateUserDto" + } + } + } + }, + "responses": { + "201": { + "description": "User created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "409": { + "description": "User already exists" + } + }, + "summary": "Create or invite user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/users/{id}": { + "get": { + "operationId": "User_get", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "404": { + "description": "User not found" + } + }, + "summary": "Get user by ID (Admin only)", + "tags": [ + "users" + ] + }, + "patch": { + "operationId": "User_update", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUserDto" + } + } + } + }, + "responses": { + "200": { + "description": "User updated successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "User not found" + } + }, + "summary": "Update user by ID", + "tags": [ + "users" + ] + }, + "delete": { + "operationId": "User_remove", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "User deleted successfully" + }, + "404": { + "description": "User not found" + } + }, + "summary": "Delete user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/users/{id}/restore": { + "post": { + "operationId": "User_restore", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "User restored successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "404": { + "description": "User not found" + } + }, + "summary": "Restore soft-deleted user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/users/{id}/reinvite": { + "post": { + "operationId": "User_reinvite", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "User ID", + "schema": { + "type": "string" + } + } + ], + "responses": { + "202": { + "description": "Invitation sent" + }, + "404": { + "description": "User not found" + } + }, + "summary": "Reinvite user (Admin only)", + "tags": [ + "users" + ] + } + }, + "/api/healthcheck": { + "get": { + "operationId": "Health_healthCheck", + "parameters": [], + "responses": { + "200": { + "description": "Service is healthy" + } + }, + "summary": "Basic health check", + "tags": [ + "health" + ] + } + }, + "/api/health/live": { + "get": { + "operationId": "Health_liveness", + "parameters": [], + "responses": { + "200": { + "description": "Service is alive" + } + }, + "summary": "Liveness probe", + "tags": [ + "health" + ] + } + }, + "/api/health/ready": { + "get": { + "operationId": "Health_readiness", + "parameters": [], + "responses": { + "200": { + "description": "Service is ready" + }, + "503": { + "description": "Service is not ready" + } + }, + "summary": "Readiness probe", + "tags": [ + "health" + ] + } + }, + "/api/sentry/debug": { + "get": { + "operationId": "Health_sentryDebug", + "parameters": [], + "responses": { + "500": { + "description": "Test error thrown for Sentry" + } + }, + "summary": "Test Sentry error capture (development only)", + "tags": [ + "health" + ] + } + }, + "/api/sentry/message": { + "get": { + "operationId": "Health_sentryMessage", + "parameters": [], + "responses": { + "200": { + "description": "Test message sent to Sentry" + } + }, + "summary": "Test Sentry message capture (development only)", + "tags": [ + "health" + ] + } + }, + "/api/seed/reset": { + "post": { + "description": "Clears all data and reseeds with base admin user. Only in non prod env.", + "operationId": "Seed_resetDatabase", + "parameters": [], + "responses": { + "200": { + "description": "Database reset successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SeedResponseDto" + } + } + } + }, + "403": { + "description": "Forbidden - not available in production" + } + }, + "summary": "Reset database with base seed data", + "tags": [ + "seed" + ] + } + }, + "/api/seed/user": { + "post": { + "description": "Creates a test user with random data", + "operationId": "Seed_seedUser", + "parameters": [], + "responses": { + "201": { + "description": "Test user created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SeedResponseDto" + } + } + } + } + }, + "summary": "Create a single test user", + "tags": [ + "seed" + ] + } + } + }, + "info": { + "title": "API", + "description": "API documentation", + "version": "1.0", + "contact": {} + }, + "tags": [ + { + "name": "auth", + "description": "Authentication endpoints" + }, + { + "name": "me", + "description": "Current user profile endpoints" + }, + { + "name": "users", + "description": "User management endpoints" + }, + { + "name": "health", + "description": "Health check endpoints" + } + ], + "servers": [], + "components": { + "securitySchemes": { + "bearer": { + "scheme": "bearer", + "bearerFormat": "JWT", + "type": "http" + } + }, + "schemas": { + "LoginDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "password": { + "type": "string", + "description": "User password", + "example": "password123", + "minLength": 8 + } + }, + "required": [ + "email", + "password" + ] + }, + "UserDto": { + "type": "object", + "properties": { + "id": { + "type": "number" + }, + "email": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "USER" + ] + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "fullName": { + "type": "string" + }, + "label": { + "type": "string" + }, + "imgUrl": { + "type": "string" + }, + "createdAt": { + "format": "date-time", + "type": "string" + }, + "updatedAt": { + "format": "date-time", + "type": "string" + }, + "deletedAt": { + "format": "date-time", + "type": "string" + } + }, + "required": [ + "id", + "email", + "role", + "firstName", + "lastName", + "fullName", + "label", + "imgUrl", + "createdAt", + "updatedAt", + "deletedAt" + ] + }, + "LoginResponseDto": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/UserDto" + }, + "accessToken": { + "type": "string", + "description": "JWT access token" + }, + "expiresInMs": { + "type": "number", + "description": "Token expiration time in milliseconds" + } + }, + "required": [ + "user", + "accessToken", + "expiresInMs" + ] + }, + "ChangePasswordDto": { + "type": "object", + "properties": { + "currentPassword": { + "type": "string", + "description": "Current password", + "example": "OldPassword123" + }, + "newPassword": { + "type": "string", + "description": "New password", + "minLength": 8, + "example": "NewSecureP@ssw0rd" + } + }, + "required": [ + "currentPassword", + "newPassword" + ] + }, + "ChangePasswordResponseDto": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Success message" + } + }, + "required": [ + "message" + ] + }, + "ForgotPasswordDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address to send reset link to", + "example": "user@example.com" + } + }, + "required": [ + "email" + ] + }, + "ResetPasswordDto": { + "type": "object", + "properties": { + "token": { + "type": "string", + "description": "Password reset token", + "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + }, + "newPassword": { + "type": "string", + "description": "New password", + "example": "NewSecureP@ssw0rd", + "minLength": 8 + } + }, + "required": [ + "token", + "newPassword" + ] + }, + "UpdateProfileDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "firstName": { + "type": "string", + "description": "User first name", + "example": "John" + }, + "lastName": { + "type": "string", + "description": "User last name", + "example": "Doe" + }, + "imgUrl": { + "type": "string", + "description": "User avatar as data URL (base64 encoded image)", + "example": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + } + } + }, + "PaginatedUsersDto": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserDto" + } + }, + "total": { + "type": "number", + "description": "Total number of items", + "example": 100 + }, + "limit": { + "type": "number", + "description": "Number of items per page", + "example": 20 + }, + "page": { + "type": "number", + "description": "Current page number", + "example": 1 + }, + "totalPages": { + "type": "number", + "description": "Total number of pages", + "example": 5 + }, + "hasPrevious": { + "type": "boolean", + "description": "Has previous page", + "example": false + }, + "hasNext": { + "type": "boolean", + "description": "Has next page", + "example": true + } + }, + "required": [ + "data", + "total", + "limit", + "page", + "totalPages", + "hasPrevious", + "hasNext" + ] + }, + "CreateUserDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "firstName": { + "type": "string", + "description": "User first name", + "example": "John" + }, + "lastName": { + "type": "string", + "description": "User last name", + "example": "Doe" + }, + "role": { + "type": "string", + "description": "User role", + "enum": [ + "ADMIN", + "USER" + ], + "example": "USER" + } + }, + "required": [ + "email" + ] + }, + "UpdateUserDto": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "User email address", + "example": "user@example.com" + }, + "firstName": { + "type": "string", + "description": "User first name", + "example": "John" + }, + "lastName": { + "type": "string", + "description": "User last name", + "example": "Doe" + }, + "imgUrl": { + "type": "string", + "description": "User avatar as data URL (base64 encoded image)", + "example": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" + }, + "role": { + "type": "string", + "description": "User role (admin only)", + "enum": [ + "ADMIN", + "USER" + ], + "example": "USER" + } + } + }, + "SeedResponseDto": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Result message" + }, + "data": { + "type": "object", + "description": "Response data" + } + }, + "required": [ + "message" + ] + } + } + } +} \ No newline at end of file diff --git a/packages/app-config/package.json b/packages/app-config/package.json index 6dc609e..0359cf5 100644 --- a/packages/app-config/package.json +++ b/packages/app-config/package.json @@ -13,6 +13,6 @@ "url-parse": "^1.5.10" }, "devDependencies": { - "rollup": "^4.24.4" + "rollup": "^4.52.4" } } diff --git a/packages/app-config/src/index.js b/packages/app-config/src/index.js index f91b912..0d9ddc8 100644 --- a/packages/app-config/src/index.js +++ b/packages/app-config/src/index.js @@ -1 +1,2 @@ export * as role from './role.js'; +export * from './url.js'; diff --git a/packages/app-config/src/url.js b/packages/app-config/src/url.js index 2cdca86..bcdd533 100644 --- a/packages/app-config/src/url.js +++ b/packages/app-config/src/url.js @@ -1,11 +1,10 @@ import isLocalhost from 'is-localhost'; -import parse from 'url-parse'; -export default function (env) { - const hostname = resolveHostname(env); +export function resolveOrigin(env) { + const { HOSTNAME: hostname } = env; const protocol = env.PROTOCOL ? env.PROTOCOL : resolveProtocol(hostname); const port = resolvePort(env); - const origin = resolveOrigin( + const origin = resolveOriginUrl( hostname, protocol, port, @@ -14,21 +13,12 @@ export default function (env) { return { hostname, protocol, port, origin }; } -// Legacy config support -function resolveHostname(env) { - const { HOSTNAME, SERVER_URL } = env; - if (HOSTNAME) return HOSTNAME; - const LEGACY_HOSTNAME = parse(SERVER_URL).hostname; - return LEGACY_HOSTNAME || 'localhost'; -} - function resolveProtocol(hostname) { return isLocalhost(hostname) ? 'http' : 'https'; } function resolvePort(env) { - const { PORT, SERVER_PORT } = env; - return PORT || SERVER_PORT || 3001; + return env.PORT || 3000; } function resolveOriginPort(port, reverseProxyPort) { @@ -37,10 +27,10 @@ function resolveOriginPort(port, reverseProxyPort) { return `:${reverseProxyPort}`; } -function resolveOrigin( +function resolveOriginUrl( hostname = 'localhost', protocol = 'http', - port = 3001, + port = 3000, reverseProxyPort, ) { return `${protocol}://${hostname}${resolveOriginPort( diff --git a/packages/app-interfaces/user.ts b/packages/app-interfaces/user.ts index 046d2ac..aff1980 100644 --- a/packages/app-interfaces/user.ts +++ b/packages/app-interfaces/user.ts @@ -1,6 +1,5 @@ export interface User { - id: number; - uid: string; + id: string; email: string; role: string; fullName: null | string; diff --git a/packages/app-seed/user.json b/packages/app-seed/user.json index d357502..70981b1 100644 --- a/packages/app-seed/user.json +++ b/packages/app-seed/user.json @@ -1,8 +1,11 @@ [ { "email": "admin@example.com", - "password": "test", + "password": "admin123!", + "firstName": "Admin", + "lastName": "User", "role": "ADMIN", - "img_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAA6lBMVEX///9Kxsbb9PQqUIP/Tko8w8NCxMQjTIFac5rL7u7Z8/Py+/s+w8M0wsLe9fWG1tb2/PxZysrq+Piv4+PG6+uf3t6W29u+6Ohtz89gzMyK2NgeSX8APHj/TkZ/1NSy5OQWRX1/ka4TUIX/Qj1IZZDHztvx8/aaqL6qtcc6XItofqHM098xVoi6T2L6TkvvxMYAOnfd4uq3wNCJmrWjsMRjUHmeT2vFT17QTlpHUH6qT2bnTlKUT21UUHuyT2TaTleQdpB0PWb0n6D4r6/3X17/OjTbcHjOwsv05+nqb3L0U1Pdtrzy1Nb+wL94C8E/AAANZElEQVR4nN2deXvbuBGHTTmAQ4qkeIgUSduSbCfOfTjbZLs9tsd2t9t2+/2/TkFKssQDwAwIkHR/fyTPk1AiX85gBhhAwNmZcQW+vYqTdJFleRhaTGGYZ+siiZe2Pzd/e6OK7HiRW8QjLmWyTlX+g0sIsfIitqOxH1RF0TLJGFqDq0sM1CNZunpKmNFqbREI3KlJCQmL1ZNwWrsIPRcDd4JJvDBxxgYQy15QokZ3pLQKOxibgyOn6It3gCQLe2yYtqLE0oJ3gKTJtCLPMvP04e0hvWw5NtZBQazTfCeMzJBTaJHzlLoG8HZy3WJsZ40W2t2zLuqNyjhfGHHPBiMpxuoIBKlh+x0Z01HaY6zYc1FidOPB+WyLDMZXiljDdgLmmTcoXykvGzDkxAMEmLYoGcpV/XBYBz2K5IOYMRkognZpCDNG+VgG3InkhpPjZkQD7kTJyiTgevgQ2pZXGOPzrbENuBMNDQWc5RQMWIkSI+k/mQwgk5foB1yPG0ObIgvNfEE+jSZ4lJtrHW9EE4kxp6KWxnjjTMtD96JkpgvQnlKMOZWnqUA+nSzRkqcla6ymC6gHccIWLOX1LhtPHLC/FZ2pA/ZFfAKADNFXB4wmmQdbIsqpfz72o4Ol2oELp9dV6xbN1QDXTwWQIa5VAFO9jXC3fIZ4TOXfLmqphlREYbyoLxFSSjySr5PNynb8KIr8mWOv4nSRV0uJNN0En/k1hVHqelaWLDnBbu7E65DoKaCjA6qOKMNsl22kyWq+KqiGGiUNcYCL3rekhKzBnuPHeW9Iiqpr9B5PUC9b4ZJU/+UqHqJU3LcRujRV6WbYPdesIJpiv7ITsZSnT6Kijx3hiT/pY0KX9poeCpIejNCs6PdohFQl9dY177GABTjMCNUBPS0LQ3zlGTyYn6r7qBv2GKnVtFLt00FmUNXjqM65hEB1Ho/InShTfHtUmwF3WqpFHPkoQ7XDrX/aMsqVVgRKyzZqfJaRqedU6W1L+qex0nvTOklyIiWHEgebuVKYcTNTC+tmKjGViJ6mUGndRKmEAJPKtB5NBd+n5BXmlkYwBQoDVY+fMVRqTyZm1GvCDwMo952rJHvjgCrlBu4wSmFg37+jbQKRN9yf41uh2TZ4UIAON5yWmOId3mAUPdUcbcTOcDpHJ3vVYjpe6CGr22VEhe7McCvosaUxtys+oH20z7wdWiny/bvtr1hiUwWmeKdByLRI2rVa7LiQn1bNCNllplnzC9AdNmQRvb+QTdFrZv0EacJBG+FOuD4lbcYaHN8wfZmGAmSkqH/aRn56cB8ttUI9ZGMdMbJLOoKPlkJFw0YoxGWboePoQbiuTS0lIp2UjvXzXJSr1dwU56RkMxIgLinWxlDIVDEWIHL8Q4+fw61y7ugQDSbUGJYclxDjRoajZAqVRz0ZJaLm08Y0IbKW9GgLXPliVBPi+m6PxQxUX2G8QLoTZsnr42wKKldQ4f0HEKJJPeYLBJ+wZD6MUNWW3UdQjbc17BpcmKixLw1j6hftofPwQvS/93EfM/h1gXHm3c2LFzcvwQ/9srz8AXjxBu6m+2EwZkziwfrcN58vLy4ur94Cn/ntVXn55xvY1YiCy97lEH4NdNJXV+eVtrBnvtnuLr96BUPM4Q9MkK/EckEVxPs9IHtmiOc9HC+/BxEimlUVGDFjQ8Hc44m+bA+PvIVY5dXx8i8gQsQTV2NETH6BTVQcH/kS4qY3l6gXcoZpV9W+NogeTatC163XR8LvAJd/dyR8DSOEN8SqV4Npt7AfUZ00LEjCeIlrtmeoIVTpdXBAy4M9wNnzvVUu3oAuf3Oxtzg0u2D6KLg6K3TgdH9eIV5uYTZ52O4uP4eFUlTNjQSo/Anvdd9cbbdXb6FPfP+2vByY8JkCVLrAhF7EfNr9u3dQPoXL4SMoFjpW8GQxUqW7Q/COJuujxIhkMYV9GivBgymNMV2gkSs0J4KbhaVwxOuYwNhwL3hliUVHeJdm/ALGo+DhkXVqMui1Vr+fimgVokifITptsKHTIEKk/BxBaGZzJiUhuik5JnlOZzNxBGGIIJxOwsdUFEPE0GL8UumjMDVTDOF09vU3Rfh/b0Mym02FEUWIiKX+zJkIIyrSoAhnM8efwgADRYjI+CVhyQh9jpc3b59DdPM7zOgXSZgj+qV7QiZQUH14X85GQHS5hRZK8YRsQASfFz8SQsz4sL04hws6ZYEnXCPGh0dCJmlrfI8BhJdK0YQpYoxfI3Qknnqcu4AJVP9XIUwQBYEa4cwR543nOBOen18YIowRtbY6oQTxPRLwfGuG0F0iCgINQnG8wZrQFCEb1MKHy01CIeILLOJ7M4RsyAeft2gRihz1NTbSQObhFAjLHwVDr+0gFCEiCU1li3LNELjb1kEoQHyFQrx4gQFEEJbzh+CCaRchPy8GXQ3xdqf2fwBn8NGE1RwwOCF2Es645akvVy28r98+fP/77z98+9qEBE6lKhCWNV5wuugmnHED6vPLGt8PHz5eH/Txxx9qjFfvDBFWFVBwZY5DyG2K9yd+env74fr62VHX1384QdyiAimGcFd56WnDmcPrhR9XLNx+/XjKVzH+8dGMyDCDIazWRIGnG3mEfD/98nkP+KcmX6U/7xAvttgB8NkcOF7YT5dBx09cQn7KeF1Z8fbHTsBn1xXiBXA9w4miGTB47KfLoJNxXEJ+PGUB9YIL+OzZRyXAwHeghPuVB9A1wnxCvp+ePZxvu120MuJfbrdvsC4aOex+UMK9d8EARYTcYMPe+F9/5gEyxL+hBr6lmAHhhIffLwF7NQJCgRHPzj5d33H47r7BlxHv35ezux2M8HGtPrAhiggFRmT6+91d21Ov775/ja29Rs4MQ/i4AAiY80WEQiMy/fSPn2uQ13d3v/wTXVs+AEIJjzMtsLq3kFBsRKZff/rXx7uD/v3Lf9A5kDXB4/uEER6Xx8AyopAQMqER/Prbp0///fTpt3ulmYFTjwERniweAXq1kFDbiSgAQCDh6bS8BhvKCqg6AaE2PPk4KF9IbGh2lr9xLwhh7XfAoEW3EkKjKzUatwYR1n4KGkDKwjJCg27avDPMhrWvgLiphNCgmz7mQQxhY8MvkNUlhMai6bwJCCJsLuHSYENp0ldU0AKE2bDxNYCkL7WhoVUMHXcCELbWigL6plJCMw0xUiNsr/6RV2vGIezwUQhhx4JmeUqUEhoJNd3vUkrYtS9CfxuaCDVdPgqyYcd3SX+lJyfUn/M7fRRA2HnavHTfRLmX6g+mnFvKCTvdSbaJ8AiEHBNKCTk/K5AljBEIuVV2CSFvKaykcyon1J0ueCaUEXJ36pIYcXhC7g0lhPzjWMRGHJyQa0IJoeDUILERByfszoVyQtGCdGE4HZyQa0IxofAX58LFNUQGqJmQb0IJobBrlQjS/tCEomkSQS9adhCLyIZ8rzFByI8z7EaCHVxkvwMVHClBlpJyoq+VUOCkM58/yy0/WpY/TqSJYIrUj3x7ubJt2+/XsYl8h31J2TsSzgNxnxKwibpgRjjn9YMjJ15b1dGU1SmVVrFSGmU4SUa8w5eEK4c5BYeQH2gAZwUJzntyN1139KNNRupniVBCMuzOfH5B69/i0jy1uxl9btcEct6TcK7Nad3Q92Or66hNSizMT079zmPzqJdvOhj5kRS4Dz5/TS3NZ83y+jLkOwz4BKig4B61RjK7VfB2eHcEnw/I91Ma1u7nO8KjtSjweI+l6LwcStK6GX2Huz07zEdLCXZ4d4tDAGB/xbKjfCAnsUkPIKu9Vp95DTeOws9qEK2woXSdLBmlsypC+XwO9WSvVWjAw7eks+q1sj/sNf/ZOo984Ei4wzulLqXlH9InK0VyUdsIFqBVEuy1xkvbXqW54DQ23JHAGk+sFrXGDfjEKkqrg6AFV7jILbh7HPPYfjp309XdDzZU48HY2POA1Q634sqlaXOK2E6p0hlvPKHPdO5/JHBd5QHIycqOSjnLJPP0nFX9KHmHuy3NZ6vvmpK3O1td78HqlupZDRqjjWmpHsuk4/TxQaR8LNN87CcHiobKk159z+ceSLTHnNdMb0A1o357rmD2Bx9JXs/FWKqn5w4mlURYl+bMr1u47vYTRNQBOGlH7e+iO9lTRewbZI7CndIylCjVWGNXOXjYtGiodXHLfHJ9VDfXvT5JUAEaQyaOylY7y92QzBy0PJ3ESE1t4ehPJN7Q0NyOY7Ly9CDy+ItJNGjDnUIZStT0iVpRPm5MJbn53RuTEc1I4bNLfeTzpwwNSzwHolOx5nIuTAMZcKcoGz6oetmw+6cuLa2zDlKRcPh9mpMBXZWOs5d4kA4UVSlJxtpSdF4MYEdKijE3MI4Whu1IvWLsbW/nqWsu5rhuOoUNqIOYGnFW9q3xFLb0rbTsXLTVj89DL40zqyixNBqSmS8Zu/l1yClcLZAMr5jOMQwN2Yu+TZJ9fjEt72zJLkIPuFyqTeeFyXSOmBAoWq0t5HqLcp1GqLi0eCRFy2pJM2RZnsuuy9LlBCOLXJEdL3KLAVRL/RpGoxWalRex/SThThT49ipO0kWW5WG1XC4M82xdJPHSjgbI6P8Dr/kRWKqNYfYAAAAASUVORK5CYII=" + "imgUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAA6lBMVEX///9Kxsbb9PQqUIP/Tko8w8NCxMQjTIFac5rL7u7Z8/Py+/s+w8M0wsLe9fWG1tb2/PxZysrq+Piv4+PG6+uf3t6W29u+6Ohtz89gzMyK2NgeSX8APHj/TkZ/1NSy5OQWRX1/ka4TUIX/Qj1IZZDHztvx8/aaqL6qtcc6XItofqHM098xVoi6T2L6TkvvxMYAOnfd4uq3wNCJmrWjsMRjUHmeT2vFT17QTlpHUH6qT2bnTlKUT21UUHuyT2TaTleQdpB0PWb0n6D4r6/3X17/OjTbcHjOwsv05+nqb3L0U1Pdtrzy1Nb+wL94C8E/AAANZElEQVR4nN2deXvbuBGHTTmAQ4qkeIgUSduSbCfOfTjbZLs9tsd2t9t2+/2/TkFKssQDwAwIkHR/fyTPk1AiX85gBhhAwNmZcQW+vYqTdJFleRhaTGGYZ+siiZe2Pzd/e6OK7HiRW8QjLmWyTlX+g0sIsfIitqOxH1RF0TLJGFqDq0sM1CNZunpKmNFqbREI3KlJCQmL1ZNwWrsIPRcDd4JJvDBxxgYQy15QokZ3pLQKOxibgyOn6It3gCQLe2yYtqLE0oJ3gKTJtCLPMvP04e0hvWw5NtZBQazTfCeMzJBTaJHzlLoG8HZy3WJsZ40W2t2zLuqNyjhfGHHPBiMpxuoIBKlh+x0Z01HaY6zYc1FidOPB+WyLDMZXiljDdgLmmTcoXykvGzDkxAMEmLYoGcpV/XBYBz2K5IOYMRkognZpCDNG+VgG3InkhpPjZkQD7kTJyiTgevgQ2pZXGOPzrbENuBMNDQWc5RQMWIkSI+k/mQwgk5foB1yPG0ObIgvNfEE+jSZ4lJtrHW9EE4kxp6KWxnjjTMtD96JkpgvQnlKMOZWnqUA+nSzRkqcla6ymC6gHccIWLOX1LhtPHLC/FZ2pA/ZFfAKADNFXB4wmmQdbIsqpfz72o4Ol2oELp9dV6xbN1QDXTwWQIa5VAFO9jXC3fIZ4TOXfLmqphlREYbyoLxFSSjySr5PNynb8KIr8mWOv4nSRV0uJNN0En/k1hVHqelaWLDnBbu7E65DoKaCjA6qOKMNsl22kyWq+KqiGGiUNcYCL3rekhKzBnuPHeW9Iiqpr9B5PUC9b4ZJU/+UqHqJU3LcRujRV6WbYPdesIJpiv7ITsZSnT6Kijx3hiT/pY0KX9poeCpIejNCs6PdohFQl9dY177GABTjMCNUBPS0LQ3zlGTyYn6r7qBv2GKnVtFLt00FmUNXjqM65hEB1Ho/InShTfHtUmwF3WqpFHPkoQ7XDrX/aMsqVVgRKyzZqfJaRqedU6W1L+qex0nvTOklyIiWHEgebuVKYcTNTC+tmKjGViJ6mUGndRKmEAJPKtB5NBd+n5BXmlkYwBQoDVY+fMVRqTyZm1GvCDwMo952rJHvjgCrlBu4wSmFg37+jbQKRN9yf41uh2TZ4UIAON5yWmOId3mAUPdUcbcTOcDpHJ3vVYjpe6CGr22VEhe7McCvosaUxtys+oH20z7wdWiny/bvtr1hiUwWmeKdByLRI2rVa7LiQn1bNCNllplnzC9AdNmQRvb+QTdFrZv0EacJBG+FOuD4lbcYaHN8wfZmGAmSkqH/aRn56cB8ttUI9ZGMdMbJLOoKPlkJFw0YoxGWboePoQbiuTS0lIp2UjvXzXJSr1dwU56RkMxIgLinWxlDIVDEWIHL8Q4+fw61y7ugQDSbUGJYclxDjRoajZAqVRz0ZJaLm08Y0IbKW9GgLXPliVBPi+m6PxQxUX2G8QLoTZsnr42wKKldQ4f0HEKJJPeYLBJ+wZD6MUNWW3UdQjbc17BpcmKixLw1j6hftofPwQvS/93EfM/h1gXHm3c2LFzcvwQ/9srz8AXjxBu6m+2EwZkziwfrcN58vLy4ur94Cn/ntVXn55xvY1YiCy97lEH4NdNJXV+eVtrBnvtnuLr96BUPM4Q9MkK/EckEVxPs9IHtmiOc9HC+/BxEimlUVGDFjQ8Hc44m+bA+PvIVY5dXx8i8gQsQTV2NETH6BTVQcH/kS4qY3l6gXcoZpV9W+NogeTatC163XR8LvAJd/dyR8DSOEN8SqV4Npt7AfUZ00LEjCeIlrtmeoIVTpdXBAy4M9wNnzvVUu3oAuf3Oxtzg0u2D6KLg6K3TgdH9eIV5uYTZ52O4uP4eFUlTNjQSo/Anvdd9cbbdXb6FPfP+2vByY8JkCVLrAhF7EfNr9u3dQPoXL4SMoFjpW8GQxUqW7Q/COJuujxIhkMYV9GivBgymNMV2gkSs0J4KbhaVwxOuYwNhwL3hliUVHeJdm/ALGo+DhkXVqMui1Vr+fimgVokifITptsKHTIEKk/BxBaGZzJiUhuik5JnlOZzNxBGGIIJxOwsdUFEPE0GL8UumjMDVTDOF09vU3Rfh/b0Mym02FEUWIiKX+zJkIIyrSoAhnM8efwgADRYjI+CVhyQh9jpc3b59DdPM7zOgXSZgj+qV7QiZQUH14X85GQHS5hRZK8YRsQASfFz8SQsz4sL04hws6ZYEnXCPGh0dCJmlrfI8BhJdK0YQpYoxfI3Qknnqcu4AJVP9XIUwQBYEa4cwR543nOBOen18YIowRtbY6oQTxPRLwfGuG0F0iCgINQnG8wZrQFCEb1MKHy01CIeILLOJ7M4RsyAeft2gRihz1NTbSQObhFAjLHwVDr+0gFCEiCU1li3LNELjb1kEoQHyFQrx4gQFEEJbzh+CCaRchPy8GXQ3xdqf2fwBn8NGE1RwwOCF2Es645akvVy28r98+fP/77z98+9qEBE6lKhCWNV5wuugmnHED6vPLGt8PHz5eH/Txxx9qjFfvDBFWFVBwZY5DyG2K9yd+env74fr62VHX1384QdyiAimGcFd56WnDmcPrhR9XLNx+/XjKVzH+8dGMyDCDIazWRIGnG3mEfD/98nkP+KcmX6U/7xAvttgB8NkcOF7YT5dBx09cQn7KeF1Z8fbHTsBn1xXiBXA9w4miGTB47KfLoJNxXEJ+PGUB9YIL+OzZRyXAwHeghPuVB9A1wnxCvp+ePZxvu120MuJfbrdvsC4aOex+UMK9d8EARYTcYMPe+F9/5gEyxL+hBr6lmAHhhIffLwF7NQJCgRHPzj5d33H47r7BlxHv35ezux2M8HGtPrAhiggFRmT6+91d21Ov775/ja29Rs4MQ/i4AAiY80WEQiMy/fSPn2uQ13d3v/wTXVs+AEIJjzMtsLq3kFBsRKZff/rXx7uD/v3Lf9A5kDXB4/uEER6Xx8AyopAQMqER/Prbp0///fTpt3ulmYFTjwERniweAXq1kFDbiSgAQCDh6bS8BhvKCqg6AaE2PPk4KF9IbGh2lr9xLwhh7XfAoEW3EkKjKzUatwYR1n4KGkDKwjJCg27avDPMhrWvgLiphNCgmz7mQQxhY8MvkNUlhMai6bwJCCJsLuHSYENp0ldU0AKE2bDxNYCkL7WhoVUMHXcCELbWigL6plJCMw0xUiNsr/6RV2vGIezwUQhhx4JmeUqUEhoJNd3vUkrYtS9CfxuaCDVdPgqyYcd3SX+lJyfUn/M7fRRA2HnavHTfRLmX6g+mnFvKCTvdSbaJ8AiEHBNKCTk/K5AljBEIuVV2CSFvKaykcyon1J0ueCaUEXJ36pIYcXhC7g0lhPzjWMRGHJyQa0IJoeDUILERByfszoVyQtGCdGE4HZyQa0IxofAX58LFNUQGqJmQb0IJobBrlQjS/tCEomkSQS9adhCLyIZ8rzFByI8z7EaCHVxkvwMVHClBlpJyoq+VUOCkM58/yy0/WpY/TqSJYIrUj3x7ubJt2+/XsYl8h31J2TsSzgNxnxKwibpgRjjn9YMjJ15b1dGU1SmVVrFSGmU4SUa8w5eEK4c5BYeQH2gAZwUJzntyN1139KNNRupniVBCMuzOfH5B69/i0jy1uxl9btcEct6TcK7Nad3Q92Or66hNSizMT079zmPzqJdvOhj5kRS4Dz5/TS3NZ83y+jLkOwz4BKig4B61RjK7VfB2eHcEnw/I91Ma1u7nO8KjtSjweI+l6LwcStK6GX2Huz07zEdLCXZ4d4tDAGB/xbKjfCAnsUkPIKu9Vp95DTeOws9qEK2woXSdLBmlsypC+XwO9WSvVWjAw7eks+q1sj/sNf/ZOo984Ei4wzulLqXlH9InK0VyUdsIFqBVEuy1xkvbXqW54DQ23JHAGk+sFrXGDfjEKkqrg6AFV7jILbh7HPPYfjp309XdDzZU48HY2POA1Q634sqlaXOK2E6p0hlvPKHPdO5/JHBd5QHIycqOSjnLJPP0nFX9KHmHuy3NZ6vvmpK3O1td78HqlupZDRqjjWmpHsuk4/TxQaR8LNN87CcHiobKk159z+ceSLTHnNdMb0A1o357rmD2Bx9JXs/FWKqn5w4mlURYl+bMr1u47vYTRNQBOGlH7e+iO9lTRewbZI7CndIylCjVWGNXOXjYtGiodXHLfHJ9VDfXvT5JUAEaQyaOylY7y92QzBy0PJ3ESE1t4ehPJN7Q0NyOY7Ly9CDy+ItJNGjDnUIZStT0iVpRPm5MJbn53RuTEc1I4bNLfeTzpwwNSzwHolOx5nIuTAMZcKcoGz6oetmw+6cuLa2zDlKRcPh9mpMBXZWOs5d4kA4UVSlJxtpSdF4MYEdKijE3MI4Whu1IvWLsbW/nqWsu5rhuOoUNqIOYGnFW9q3xFLb0rbTsXLTVj89DL40zqyixNBqSmS8Zu/l1yClcLZAMr5jOMQwN2Yu+TZJ9fjEt72zJLkIPuFyqTeeFyXSOmBAoWq0t5HqLcp1GqLi0eCRFy2pJM2RZnsuuy9LlBCOLXJEdL3KLAVRL/RpGoxWalRex/SThThT49ipO0kWW5WG1XC4M82xdJPHSjgbI6P8Dr/kRWKqNYfYAAAAASUVORK5CYII=", + "lastLoginAt": "2023-10-01T00:00:00.000Z" } ] diff --git a/packages/app-vue-components/package.json b/packages/app-vue-components/package.json index d583803..670b7b8 100644 --- a/packages/app-vue-components/package.json +++ b/packages/app-vue-components/package.json @@ -10,7 +10,7 @@ "main": "./src/index.ts", "devDependencies": { "@app/interfaces": "workspace:*", - "@types/lodash": "^4.17.13", + "@types/lodash": "^4.17.20", "@types/pluralize": "^0.0.33" }, "peerDependencies": { @@ -28,11 +28,11 @@ "yup": "^1.4.0" }, "dependencies": { - "@tiptap/extension-character-count": "^2.8.0", - "@tiptap/extension-subscript": "^2.8.0", - "@tiptap/extension-superscript": "^2.8.0", - "@tiptap/extension-underline": "^2.8.0", - "@vueuse/core": "^10.11.0" + "@tiptap/extension-character-count": "^3.6.6", + "@tiptap/extension-subscript": "^3.6.6", + "@tiptap/extension-superscript": "^3.6.6", + "@tiptap/extension-underline": "^3.6.6", + "@vueuse/core": "^13.9.0" }, "bundledDependencies": [ "@app/interfaces" diff --git a/packages/app-vue-components/src/components/ActiveUsers.vue b/packages/app-vue-components/src/components/ActiveUsers.vue deleted file mode 100644 index f1af22a..0000000 --- a/packages/app-vue-components/src/components/ActiveUsers.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/packages/app-vue-components/src/components/TailorTreeview/ItemGroup.vue b/packages/app-vue-components/src/components/TailorTreeview/ItemGroup.vue deleted file mode 100644 index 3b79b07..0000000 --- a/packages/app-vue-components/src/components/TailorTreeview/ItemGroup.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/packages/app-vue-components/src/components/TailorTreeview/ListItem.vue b/packages/app-vue-components/src/components/TailorTreeview/ListItem.vue deleted file mode 100644 index dd4f65e..0000000 --- a/packages/app-vue-components/src/components/TailorTreeview/ListItem.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/packages/app-vue-components/src/components/TailorTreeview/index.vue b/packages/app-vue-components/src/components/TailorTreeview/index.vue deleted file mode 100644 index 518350a..0000000 --- a/packages/app-vue-components/src/components/TailorTreeview/index.vue +++ /dev/null @@ -1,125 +0,0 @@ - - - diff --git a/packages/app-vue-components/src/index.ts b/packages/app-vue-components/src/index.ts index af036d0..77e99c4 100644 --- a/packages/app-vue-components/src/index.ts +++ b/packages/app-vue-components/src/index.ts @@ -1,7 +1,5 @@ export { default as CircularProgress } from './components/CircularProgress.vue'; -export { default as TailorTreeview } from './components/TailorTreeview/index.vue'; export { default as UserAvatar } from './components/UserAvatar.vue'; -export { default as ActiveUsers } from './components/ActiveUsers.vue'; export { useLoader } from './composables/useLoader'; export { useConfirmationDialog } from './composables/useConfirmationDialog'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fe5a4b2..11a8329 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,14 @@ importers: .: dependencies: '@inquirer/select': - specifier: ^2.4.7 - version: 2.4.7 + specifier: ^4.3.4 + version: 4.3.4(@types/node@24.7.2) concurrently: - specifier: ^9.1.0 - version: 9.1.0 + specifier: ^9.2.1 + version: 9.2.1 dotenv: - specifier: ^16.4.5 - version: 16.4.5 + specifier: ^17.2.3 + version: 17.2.3 fkill: specifier: ^9.0.0 version: 9.0.0 @@ -25,312 +25,288 @@ importers: specifier: workspace:^ version: link:packages/app-seed '@nuxt/eslint-config': - specifier: ^0.6.1 - version: 0.6.1(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) + specifier: ^1.9.0 + version: 1.9.0(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) boxen: specifier: ^8.0.1 version: 8.0.1 chalk: - specifier: ^5.3.0 - version: 5.3.0 + specifier: ^5.6.2 + version: 5.6.2 dotenv-cli: - specifier: ^7.4.2 - version: 7.4.2 + specifier: ^10.0.0 + version: 10.0.0 eslint: - specifier: ^9.14.0 - version: 9.14.0(jiti@2.4.0) + specifier: ^9.37.0 + version: 9.37.0(jiti@2.6.1) execa: - specifier: ^9.5.1 - version: 9.5.1 + specifier: ^9.6.0 + version: 9.6.0 inquirer: - specifier: ^9.2.23 - version: 9.3.6 + specifier: ^12.9.6 + version: 12.9.6(@types/node@24.7.2) lodash: specifier: ^4.17.21 version: 4.17.21 + massimo: + specifier: ^1.0.1 + version: 1.0.1 + massimo-cli: + specifier: ^1.0.1 + version: 1.0.1 minimist: specifier: ^1.2.8 version: 1.2.8 ora: - specifier: ^8.1.1 - version: 8.1.1 + specifier: ^9.0.0 + version: 9.0.0 pg: - specifier: ^8.13.1 - version: 8.13.1 + specifier: ^8.16.3 + version: 8.16.3 pid-port: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^2.0.0 + version: 2.0.0 pkg-dir: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^9.0.0 + version: 9.0.0 + prettier: + specifier: ^3.6.2 + version: 3.6.2 shelljs: - specifier: ^0.8.5 - version: 0.8.5 + specifier: ^0.10.0 + version: 0.10.0 typescript: - specifier: ^5.6.3 - version: 5.6.3 + specifier: ^5.9.3 + version: 5.9.3 vitepress: - specifier: ^1.5.0 - version: 1.5.0(@algolia/client-search@4.24.0)(@types/node@22.9.0)(axios@1.7.7)(change-case@5.4.4)(postcss@8.4.47)(sass@1.79.5)(search-insights@2.17.0)(sortablejs@1.14.0)(terser@5.36.0)(typescript@5.6.3) + specifier: ^1.6.4 + version: 1.6.4(@algolia/client-search@5.40.0)(@types/node@24.7.2)(axios@1.12.2)(change-case@5.4.4)(fuse.js@7.1.0)(postcss@8.5.6)(sass@1.93.2)(search-insights@2.17.3)(sortablejs@1.14.0)(terser@5.44.0)(typescript@5.9.3) apps/backend: dependencies: '@app/config': - specifier: workspace:* + specifier: workspace:^ version: link:../../packages/app-config '@app/seed': - specifier: workspace:* + specifier: workspace:^ version: link:../../packages/app-seed - '@aws-sdk/client-s3': - specifier: ^3.687.0 - version: 3.687.0 - '@aws-sdk/lib-storage': - specifier: ^3.687.0 - version: 3.687.0(@aws-sdk/client-s3@3.687.0) - '@aws-sdk/s3-request-presigner': - specifier: ^3.687.0 - version: 3.687.0 - '@aws-sdk/util-format-url': - specifier: ^3.686.0 - version: 3.686.0 - '@faker-js/faker': - specifier: ^8.4.1 - version: 8.4.1 - '@keyv/redis': - specifier: ^3.0.1 - version: 3.0.1 - '@paralleldrive/cuid2': - specifier: ^2.2.2 - version: 2.2.2 - JSONStream: - specifier: ^1.3.5 - version: 1.3.5 - auto-bind: - specifier: ^5.0.1 - version: 5.0.1 - axios: - specifier: ^1.7.7 - version: 1.7.7(debug@4.3.7) + '@mikro-orm/cli': + specifier: ^6.5.8 + version: 6.5.8(libsql@0.5.22)(pg@8.16.3) + '@mikro-orm/core': + specifier: ^6.5.8 + version: 6.5.8 + '@mikro-orm/migrations': + specifier: ^6.5.8 + version: 6.5.8(@mikro-orm/core@6.5.8)(@types/node@24.7.2)(libsql@0.5.22)(pg@8.16.3) + '@mikro-orm/nestjs': + specifier: ^6.1.1 + version: 6.1.1(@mikro-orm/core@6.5.8)(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) + '@mikro-orm/postgresql': + specifier: ^6.5.8 + version: 6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22) + '@mikro-orm/reflection': + specifier: ^6.5.8 + version: 6.5.8(@mikro-orm/core@6.5.8) + '@mikro-orm/seeder': + specifier: ^6.5.8 + version: 6.5.8(@mikro-orm/core@6.5.8) + '@mikro-orm/sql-highlighter': + specifier: ^1.0.1 + version: 1.0.1 + '@nestjs/common': + specifier: ^11.1.6 + version: 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/config': + specifier: ^4.0.2 + version: 4.0.2(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) + '@nestjs/core': + specifier: ^11.1.6 + version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/jwt': + specifier: ^11.0.1 + version: 11.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)) + '@nestjs/passport': + specifier: ^11.0.5 + version: 11.0.5(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) + '@nestjs/platform-express': + specifier: ^11.1.6 + version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) + '@nestjs/serve-static': + specifier: ^5.0.4 + version: 5.0.4(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(express@5.1.0) + '@nestjs/swagger': + specifier: ^11.2.0 + version: 11.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) + '@nestjs/throttler': + specifier: ^6.4.0 + version: 6.4.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(reflect-metadata@0.2.2) + '@sentry/nestjs': + specifier: ^10.19.0 + version: 10.19.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) + '@sentry/profiling-node': + specifier: ^10.19.0 + version: 10.19.0 + '@types/handlebars': + specifier: ^4.1.0 + version: 4.1.0 bcrypt: - specifier: ^5.1.1 - version: 5.1.1(encoding@0.1.13) - bluebird: - specifier: ^3.7.2 - version: 3.7.2 - body-parser: - specifier: ^1.20.3 - version: 1.20.3 - boxen: - specifier: ^7.1.1 - version: 7.1.1 - change-case: - specifier: ^5.4.4 - version: 5.4.4 - cheerio: - specifier: 1.0.0-rc.12 - version: 1.0.0-rc.12 - connect-history-api-fallback: - specifier: ^2.0.0 - version: 2.0.0 - consolidate: - specifier: ^1.0.4 - version: 1.0.4(@babel/core@7.26.0)(lodash@4.17.21)(mustache@4.2.0) - cookie-parser: - specifier: ^1.4.7 - version: 1.4.7 - cors: - specifier: ^2.8.5 - version: 2.8.5 - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - emailjs: - specifier: ^4.0.3 - version: 4.0.3(typescript@5.6.3) - express: - specifier: 5.0.0 - version: 5.0.0 - express-rate-limit: - specifier: ^7.4.1 - version: 7.4.1(express@5.0.0) - express-session: - specifier: ^1.18.1 - version: 1.18.1 - fecha: - specifier: ^4.2.3 - version: 4.2.3 - fs-blob-store: specifier: ^6.0.0 version: 6.0.0 - gravatar: + casual: + specifier: ^1.6.2 + version: 1.6.2 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.2 + version: 0.14.2 + common-tags: specifier: ^1.8.2 version: 1.8.2 - hash-obj: - specifier: ^4.0.0 - version: 4.0.0 - hashids: - specifier: ^2.3.0 - version: 2.3.0 + cookie-parser: + specifier: ^1.4.7 + version: 1.4.7 + handlebars: + specifier: ^4.7.8 + version: 4.7.8 helmet: - specifier: ^7.1.0 - version: 7.1.0 - html-to-text: - specifier: ^9.0.5 - version: 9.0.5 - http-errors: - specifier: ^2.0.0 - version: 2.0.0 - http-status-codes: - specifier: ^2.3.0 - version: 2.3.0 - jsonwebtoken: - specifier: ^9.0.2 - version: 9.0.2 - jszip: - specifier: ^3.10.1 - version: 3.10.1 - keyv: - specifier: ^5.1.3 - version: 5.1.3 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - luxon: - specifier: ^3.5.0 - version: 3.5.0 - mime-types: - specifier: ^2.1.35 - version: 2.1.35 - minimist: - specifier: ^1.2.8 - version: 1.2.8 - mjml: - specifier: ^4.15.3 - version: 4.15.3(encoding@0.1.13) - mkdirp: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^8.1.0 + version: 8.1.0 + joi: + specifier: ^18.0.1 + version: 18.0.1 + ms: + specifier: ^2.1.3 + version: 2.1.3 multer: - specifier: ^1.4.5-lts.1 - version: 1.4.5-lts.1 - mustache: - specifier: ^4.2.0 - version: 4.2.0 - openai: - specifier: ^4.71.1 - version: 4.71.1(encoding@0.1.13) - openid-client: - specifier: ^5.7.0 - version: 5.7.0 + specifier: ^2.0.2 + version: 2.0.2 + nestjs-pino: + specifier: ^4.4.1 + version: 4.4.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@10.5.0)(pino@9.13.1)(rxjs@7.8.2) + nodemailer: + specifier: ^7.0.9 + version: 7.0.9 passport: - specifier: ^0.6.0 - version: 0.6.0 + specifier: ^0.7.0 + version: 0.7.0 passport-jwt: specifier: ^4.0.1 version: 4.0.1 passport-local: specifier: ^1.0.0 version: 1.0.0 - path-exists: - specifier: ^5.0.0 - version: 5.0.0 - pg: - specifier: ^8.13.1 - version: 8.13.1 - pg-query-stream: - specifier: ^4.7.1 - version: 4.7.1(pg@8.13.1) - pino: - specifier: ^9.5.0 - version: 9.5.0 - pino-http: - specifier: ^10.3.0 - version: 10.3.0 pino-pretty: - specifier: ^12.0.0 - version: 12.0.0 - pkg-dir: - specifier: ^8.0.0 - version: 8.0.0 - promise-queue: - specifier: ^2.2.5 - version: 2.2.5 - qs: - specifier: ^6.13.0 - version: 6.13.0 - randomstring: - specifier: ^1.3.0 - version: 1.3.0 - read-pkg-up: - specifier: ^10.1.0 - version: 10.1.0 - safe-require: - specifier: ^1.0.4 - version: 1.0.4 - semver: - specifier: ^7.6.3 - version: 7.6.3 - sequelize: - specifier: ^6.37.5 - version: 6.37.5(pg@8.13.1) - sequelize-replace-enum-postgres: - specifier: ^1.6.0 - version: 1.6.0 - simple-oauth2: + specifier: ^13.1.2 + version: 13.1.2 + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + rxjs: + specifier: ^7.8.2 + version: 7.8.2 + swagger-ui-express: + specifier: ^5.0.1 + version: 5.0.1(express@5.1.0) + uuid: + specifier: ^13.0.0 + version: 13.0.0 + yn: specifier: ^5.1.0 version: 5.1.0 - to-case: + devDependencies: + '@libsql/client': + specifier: ^0.15.15 + version: 0.15.15 + '@mikro-orm/libsql': + specifier: ^6.5.8 + version: 6.5.8(@mikro-orm/core@6.5.8)(pg@8.16.3) + '@nestjs/cli': + specifier: ^11.0.10 + version: 11.0.10(@types/node@24.7.2) + '@nestjs/schematics': + specifier: ^11.0.9 + version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) + '@nestjs/testing': + specifier: ^11.1.6 + version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/platform-express@11.1.6) + '@types/bcrypt': + specifier: ^6.0.0 + version: 6.0.0 + '@types/cookie-parser': + specifier: ^1.4.9 + version: 1.4.9(@types/express@5.0.3) + '@types/express': + specifier: ^5.0.3 + version: 5.0.3 + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/jsonwebtoken': + specifier: ^9.0.10 + version: 9.0.10 + '@types/multer': specifier: ^2.0.0 version: 2.0.0 - untildify: - specifier: ^5.0.0 - version: 5.0.0 - url-join: - specifier: ^5.0.0 - version: 5.0.0 - url-parse: - specifier: ^1.5.10 - version: 1.5.10 - uuid: + '@types/node': + specifier: ^24.7.2 + version: 24.7.2 + '@types/nodemailer': + specifier: ^7.0.2 + version: 7.0.2 + '@types/passport-jwt': + specifier: ^4.0.1 + version: 4.0.1 + '@types/passport-local': + specifier: ^1.0.38 + version: 1.0.38 + '@types/set-cookie-parser': + specifier: ^2.4.10 + version: 2.4.10 + '@types/supertest': + specifier: ^6.0.3 + version: 6.0.3 + '@types/uuid': + specifier: ^11.0.0 + version: 11.0.0 + dotenv-cli: specifier: ^10.0.0 version: 10.0.0 - yn: - specifier: ^5.0.0 - version: 5.0.0 - yup: - specifier: ^1.4.0 - version: 1.4.0 - devDependencies: - '@types/bluebird': - specifier: ^3.5.42 - version: 3.5.42 - '@types/express': - specifier: ^5.0.0 - version: 5.0.0 - dargs: - specifier: ^8.1.0 - version: 8.1.0 - del-cli: - specifier: ^5.1.0 - version: 5.1.0 - dotenv-cli: - specifier: ^7.4.2 - version: 7.4.2 - nodemon: - specifier: ^3.1.7 - version: 3.1.7 - sequelize-cli: - specifier: ^6.6.2 - version: 6.6.2 - terser: - specifier: ^5.36.0 - version: 5.36.0 - umzug: - specifier: ^3.8.2 - version: 3.8.2(@types/node@22.9.0) + jest: + specifier: ^30.2.0 + version: 30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + set-cookie-parser: + specifier: ^2.7.1 + version: 2.7.1 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + supertest: + specifier: ^7.1.4 + version: 7.1.4 + ts-jest: + specifier: ^29.4.5 + version: 29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)))(typescript@5.9.3) + ts-loader: + specifier: ^9.5.4 + version: 9.5.4(typescript@5.9.3)(webpack@5.100.2) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@24.7.2)(typescript@5.9.3) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 apps/frontend: dependencies: @@ -344,20 +320,23 @@ importers: specifier: ^2.2.2 version: 2.2.2 '@pinia/nuxt': - specifier: ^0.5.1 - version: 0.5.5(magicast@0.3.5)(rollup@4.24.4)(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) + specifier: ^0.11.2 + version: 0.11.2(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))) '@vee-validate/i18n': - specifier: ^4.14.6 - version: 4.14.6 + specifier: ^4.15.1 + version: 4.15.1 '@vee-validate/rules': - specifier: ^4.14.6 - version: 4.14.6(vue@3.5.12(typescript@5.6.3)) + specifier: ^4.15.1 + version: 4.15.1(vue@3.5.22(typescript@5.9.3)) '@vueuse/core': - specifier: ^10.11.0 - version: 10.11.1(vue@3.5.12(typescript@5.6.3)) + specifier: ^13.9.0 + version: 13.9.0(vue@3.5.22(typescript@5.9.3)) + app-api-client: + specifier: workspace:* + version: link:../../packages/app-api-client axios: - specifier: ^1.7.7 - version: 1.7.7(debug@4.3.7) + specifier: ^1.12.2 + version: 1.12.2(debug@4.4.3) bluebird: specifier: ^3.7.2 version: 3.7.2 @@ -365,11 +344,11 @@ importers: specifier: ^1.2.1 version: 1.2.1 date-fns: - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^4.1.0 + version: 4.1.0 debug: - specifier: ^4.3.7 - version: 4.3.7(supports-color@9.4.0) + specifier: ^4.4.3 + version: 4.4.3 fecha: specifier: ^4.2.3 version: 4.2.3 @@ -377,8 +356,8 @@ importers: specifier: ^2.3.0 version: 2.3.0 humanize-string: - specifier: ^3.0.0 - version: 3.0.0 + specifier: ^3.1.0 + version: 3.1.0 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -386,11 +365,11 @@ importers: specifier: ^3.0.1 version: 3.0.1 p-min-delay: - specifier: ^4.0.2 - version: 4.0.2 + specifier: ^4.2.0 + version: 4.2.0 pinia: - specifier: ^2.2.6 - version: 2.2.6(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + specifier: ^3.0.3 + version: 3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) pluralize: specifier: ^8.0.0 version: 8.0.0 @@ -405,32 +384,32 @@ importers: version: 5.0.0 v-clipboard: specifier: 3.0.0-next.1 - version: 3.0.0-next.1(typescript@5.6.3) + version: 3.0.0-next.1(typescript@5.9.3) vee-validate: - specifier: 4.14.6 - version: 4.14.6(vue@3.5.12(typescript@5.6.3)) + specifier: 4.15.1 + version: 4.15.1(vue@3.5.22(typescript@5.9.3)) vue3-tree-vue: - specifier: ^2.0.11 - version: 2.0.11(vue@3.5.12(typescript@5.6.3)) + specifier: ^2.0.15 + version: 2.0.15(vue@3.5.22(typescript@5.9.3)) vuedraggable: specifier: 4.1.0 - version: 4.1.0(vue@3.5.12(typescript@5.6.3)) + version: 4.1.0(vue@3.5.22(typescript@5.9.3)) vuetify: - specifier: 3.7.4 - version: 3.7.4(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + specifier: 3.10.5 + version: 3.10.5(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) yup: - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^1.7.1 + version: 1.7.1 devDependencies: '@app/interfaces': specifier: workspace:* version: link:../../packages/app-interfaces '@nuxt/devtools': specifier: latest - version: 1.3.14(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(webpack-sources@3.2.3) + version: 2.6.5(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@nuxtjs/google-fonts': specifier: ^3.2.0 - version: 3.2.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) + version: 3.2.0(magicast@0.3.5) '@types/bluebird': specifier: ^3.5.42 version: 3.5.42 @@ -438,8 +417,8 @@ importers: specifier: ^4.1.12 version: 4.1.12 '@types/lodash': - specifier: ^4.17.13 - version: 4.17.13 + specifier: ^4.17.20 + version: 4.17.20 '@types/pluralize': specifier: ^0.0.33 version: 0.0.33 @@ -447,42 +426,62 @@ importers: specifier: ^2.2.3 version: 2.2.3 '@typescript-eslint/parser': - specifier: ^6.9.0 - version: 6.21.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) + specifier: ^8.46.0 + version: 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.47) + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.6) nuxt: - specifier: 3.13.0 - version: 3.13.0(@parcel/watcher@2.4.1)(@types/node@22.9.0)(encoding@0.1.13)(eslint@9.14.0(jiti@2.4.0))(ioredis@5.4.1)(magicast@0.3.5)(meow@10.1.5)(optionator@0.9.4)(rollup@4.24.4)(sass@1.79.5)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3)(xml2js@0.6.2) + specifier: 4.1.2 + version: 4.1.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(@libsql/client@0.15.15))(encoding@0.1.13)(eslint@9.37.0(jiti@2.6.1))(ioredis@5.8.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.4)(sass@1.93.2)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) sass: - specifier: ^1.79.5 - version: 1.79.5 + specifier: ^1.93.2 + version: 1.93.2 vue: - specifier: ^3.5.12 - version: 3.5.12(typescript@5.6.3) + specifier: ^3.5.22 + version: 3.5.22(typescript@5.9.3) vue-router: - specifier: ^4.4.5 - version: 4.4.5(vue@3.5.12(typescript@5.6.3)) + specifier: ^4.5.1 + version: 4.5.1(vue@3.5.22(typescript@5.9.3)) infrastructure: dependencies: '@pulumi/aws': - specifier: ^6.58.0 - version: 6.58.0(typescript@5.6.3) + specifier: ^7.8.0 + version: 7.8.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) '@pulumi/awsx': - specifier: ^2.17.0 - version: 2.17.0(typescript@5.6.3) + specifier: ^3.0.0 + version: 3.0.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) '@pulumi/pulumi': - specifier: ^3.138.0 - version: 3.138.0(typescript@5.6.3) + specifier: ^3.202.0 + version: 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) '@studion/infra-code-blocks': - specifier: ^0.6.11 - version: 0.6.11(typescript@5.6.3) + specifier: ^0.7.0 + version: 0.7.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) devDependencies: '@types/node': - specifier: ^22 - version: 22.5.0 + specifier: ^24 + version: 24.7.2 + + packages/api-client-generator: + dependencies: + chokidar: + specifier: ^4.0.3 + version: 4.0.3 + common-tags: + specifier: ^1.8.2 + version: 1.8.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + minimist: + specifier: ^1.2.8 + version: 1.2.8 + package-up: + specifier: ^5.0.0 + version: 5.0.0 + + packages/app-api-client: {} packages/app-config: dependencies: @@ -494,8 +493,8 @@ importers: version: 1.5.10 devDependencies: rollup: - specifier: ^4.24.4 - version: 4.24.4 + specifier: ^4.52.4 + version: 4.52.4 packages/app-interfaces: {} @@ -504,29 +503,29 @@ importers: packages/app-vue-components: dependencies: '@tiptap/extension-character-count': - specifier: ^2.8.0 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) + specifier: ^3.6.6 + version: 3.6.6(@tiptap/extensions@3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)) '@tiptap/extension-subscript': - specifier: ^2.8.0 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^3.6.6 + version: 3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) '@tiptap/extension-superscript': - specifier: ^2.8.0 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^3.6.6 + version: 3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) '@tiptap/extension-underline': - specifier: ^2.8.0 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) + specifier: ^3.6.6 + version: 3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) '@tiptap/pm': specifier: ^2.4.0 - version: 2.9.1 + version: 2.26.3 '@tiptap/starter-kit': specifier: ^2.4.0 - version: 2.9.1 + version: 2.26.3 '@tiptap/vue-3': specifier: ^2.4.0 - version: 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(vue@3.5.12(typescript@5.6.3)) + version: 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)(vue@3.5.22(typescript@5.9.3)) '@vueuse/core': - specifier: ^10.11.0 - version: 10.11.1(vue@3.5.12(typescript@5.6.3)) + specifier: ^13.9.0 + version: 13.9.0(vue@3.5.22(typescript@5.9.3)) date-fns: specifier: ^3.6.0 version: 3.6.0 @@ -535,32 +534,32 @@ importers: version: 4.17.21 p-min-delay: specifier: ^4.0.2 - version: 4.0.2 + version: 4.2.0 pluralize: specifier: ^8.0.0 version: 8.0.0 vee-validate: specifier: ^4.13.2 - version: 4.13.2(vue@3.5.12(typescript@5.6.3)) + version: 4.15.1(vue@3.5.22(typescript@5.9.3)) vue: specifier: ^3.3.4 - version: 3.5.12(typescript@5.6.3) + version: 3.5.22(typescript@5.9.3) vuedraggable: specifier: ^4.1.0 - version: 4.1.0(vue@3.5.12(typescript@5.6.3)) + version: 4.1.0(vue@3.5.22(typescript@5.9.3)) vuetify: specifier: 3.7.0 - version: 3.7.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + version: 3.7.0(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) yup: specifier: ^1.4.0 - version: 1.4.0 + version: 1.7.1 devDependencies: '@app/interfaces': specifier: workspace:* version: link:../app-interfaces '@types/lodash': - specifier: ^4.17.13 - version: 4.17.13 + specifier: ^4.17.20 + version: 4.17.20 '@types/pluralize': specifier: ^0.0.33 version: 0.0.33 @@ -571,123 +570,170 @@ importers: specifier: workspace:^ version: link:../packages/app-seed '@faker-js/faker': - specifier: ^8.4.1 - version: 8.4.1 + specifier: ^10.0.0 + version: 10.0.0 date-fns: - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^4.1.0 + version: 4.1.0 dotenv: - specifier: ^16.4.5 - version: 16.4.5 + specifier: ^17.2.3 + version: 17.2.3 jsdom: - specifier: ^24.1.0 - version: 24.1.3 + specifier: ^27.0.0 + version: 27.0.0(postcss@8.5.6) lodash: specifier: ^4.17.21 version: 4.17.21 mailtrap: - specifier: ^3.4.0 - version: 3.4.0 + specifier: ^4.3.0 + version: 4.3.0 devDependencies: '@axe-core/playwright': - specifier: 4.10.0 - version: 4.10.0(playwright-core@1.46.1) + specifier: 4.10.2 + version: 4.10.2(playwright-core@1.56.0) '@percy/cli': - specifier: ^1.30.1 - version: 1.30.1(typescript@5.6.3) + specifier: ^1.31.3 + version: 1.31.3(typescript@5.9.3) '@percy/playwright': - specifier: ^1.0.6 - version: 1.0.6(playwright-core@1.46.1) + specifier: ^1.0.9 + version: 1.0.9(playwright-core@1.56.0) '@playwright/test': - specifier: 1.46.1 - version: 1.46.1 + specifier: 1.56.0 + version: 1.56.0 '@types/node': - specifier: ^22.9.0 - version: 22.9.0 + specifier: ^24.7.2 + version: 24.7.2 packages: - '@algolia/autocomplete-core@1.9.3': - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} + '@algolia/abtesting@1.6.0': + resolution: {integrity: sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==} + engines: {node: '>= 14.0.0'} - '@algolia/autocomplete-plugin-algolia-insights@1.9.3': - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} peerDependencies: search-insights: '>= 1 < 3' - '@algolia/autocomplete-preset-algolia@1.9.3': - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/autocomplete-shared@1.9.3': - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/cache-browser-local-storage@4.24.0': - resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==} + '@algolia/client-abtesting@5.40.0': + resolution: {integrity: sha512-qegVlgHtmiS8m9nEsuKUVhlw1FHsIshtt5nhNnA6EYz3g+tm9+xkVZZMzkrMLPP7kpoheHJZAwz2MYnHtwFa9A==} + engines: {node: '>= 14.0.0'} - '@algolia/cache-common@4.24.0': - resolution: {integrity: sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==} + '@algolia/client-analytics@5.40.0': + resolution: {integrity: sha512-Dw2c+6KGkw7mucnnxPyyMsIGEY8+hqv6oB+viYB612OMM3l8aNaWToBZMnNvXsyP+fArwq7XGR+k3boPZyV53A==} + engines: {node: '>= 14.0.0'} - '@algolia/cache-in-memory@4.24.0': - resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==} + '@algolia/client-common@5.40.0': + resolution: {integrity: sha512-dbE4+MJIDsTghG3hUYWBq7THhaAmqNqvW9g2vzwPf5edU4IRmuYpKtY3MMotes8/wdTasWG07XoaVhplJBlvdg==} + engines: {node: '>= 14.0.0'} - '@algolia/client-account@4.24.0': - resolution: {integrity: sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==} + '@algolia/client-insights@5.40.0': + resolution: {integrity: sha512-SH6zlROyGUCDDWg71DlCnbbZ/zEHYPZC8k901EAaBVhvY43Ju8Wa6LAcMPC4tahcDBgkG2poBy8nJZXvwEWAlQ==} + engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@4.24.0': - resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==} + '@algolia/client-personalization@5.40.0': + resolution: {integrity: sha512-EgHjJEEf7CbUL9gJHI1ULmAtAFeym2cFNSAi1uwHelWgLPcnLjYW2opruPxigOV7NcetkGu+t2pcWOWmZFuvKQ==} + engines: {node: '>= 14.0.0'} - '@algolia/client-common@4.24.0': - resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==} + '@algolia/client-query-suggestions@5.40.0': + resolution: {integrity: sha512-HvE1jtCag95DR41tDh7cGwrMk4X0aQXPOBIhZRmsBPolMeqRJz0kvfVw8VCKvA1uuoAkjFfTG0X0IZED+rKXoA==} + engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@4.24.0': - resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==} + '@algolia/client-search@5.40.0': + resolution: {integrity: sha512-nlr/MMgoLNUHcfWC5Ns2ENrzKx9x51orPc6wJ8Ignv1DsrUmKm0LUih+Tj3J+kxYofzqQIQRU495d4xn3ozMbg==} + engines: {node: '>= 14.0.0'} - '@algolia/client-search@4.24.0': - resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==} + '@algolia/ingestion@1.40.0': + resolution: {integrity: sha512-OfHnhE+P0f+p3i90Kmshf9Epgesw5oPV1IEUOY4Mq1HV7cQk16gvklVN1EaY/T9sVavl+Vc3g4ojlfpIwZFA4g==} + engines: {node: '>= 14.0.0'} - '@algolia/logger-common@4.24.0': - resolution: {integrity: sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==} + '@algolia/monitoring@1.40.0': + resolution: {integrity: sha512-SWANV32PTKhBYvwKozeWP9HOnVabOixAuPdFFGoqtysTkkwutrtGI/rrh80tvG+BnQAmZX0vUmD/RqFZVfr/Yg==} + engines: {node: '>= 14.0.0'} - '@algolia/logger-console@4.24.0': - resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==} + '@algolia/recommend@5.40.0': + resolution: {integrity: sha512-1Qxy9I5bSb3mrhPk809DllMa561zl5hLsMR6YhIqNkqQ0OyXXQokvJ2zApSxvd39veRZZnhN+oGe+XNoNwLgkw==} + engines: {node: '>= 14.0.0'} - '@algolia/recommend@4.24.0': - resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==} + '@algolia/requester-browser-xhr@5.40.0': + resolution: {integrity: sha512-MGt94rdHfkrVjfN/KwUfWcnaeohYbWGINrPs96f5J7ZyRYpVLF+VtPQ2FmcddFvK4gnKXSu8BAi81hiIhUpm3w==} + engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@4.24.0': - resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==} + '@algolia/requester-fetch@5.40.0': + resolution: {integrity: sha512-wXQ05JZZ10Dr642QVAkAZ4ZZlU+lh5r6dIBGmm9WElz+1EaQ6BNYtEOTV6pkXuFYsZpeJA89JpDOiwBOP9j24w==} + engines: {node: '>= 14.0.0'} - '@algolia/requester-common@4.24.0': - resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==} + '@algolia/requester-node-http@5.40.0': + resolution: {integrity: sha512-5qCRoySnzpbQVg2IPLGFCm4LF75pToxI5tdjOYgUMNL/um91aJ4dH3SVdBEuFlVsalxl8mh3bWPgkUmv6NpJiQ==} + engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@4.24.0': - resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==} + '@angular-devkit/core@19.2.15': + resolution: {integrity: sha512-pU2RZYX6vhd7uLSdLwPnuBcr0mXJSjp3EgOXKsrlQFQZevc+Qs+2JdXgIElnOT/aDqtRtriDmLlSbtdE8n3ZbA==} + 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 - '@algolia/transporter@4.24.0': - resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==} + '@angular-devkit/core@19.2.17': + resolution: {integrity: sha512-Ah008x2RJkd0F+NLKqIpA34/vUGwjlprRCkvddjDopAWRzYn6xCkz1Tqwuhn0nR1Dy47wTLKYD999TYl5ONOAQ==} + 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 - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@angular-devkit/schematics-cli@19.2.15': + resolution: {integrity: sha512-1ESFmFGMpGQmalDB3t2EtmWDGv6gOFYBMxmHO2f1KI/UDl8UmZnCGL4mD3EWo8Hv0YIsZ9wOH9Q7ZHNYjeSpzg==} + 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 - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@angular-devkit/schematics@19.2.15': + resolution: {integrity: sha512-kNOJ+3vekJJCQKWihNmxBkarJzNW09kP5a9E1SRNiQVNOUEeSwcRR0qYotM65nx821gNzjjhJXnAZ8OazWldrg==} + 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'} + '@angular-devkit/schematics@19.2.17': + resolution: {integrity: sha512-ADfbaBsrG8mBF6Mfs+crKA/2ykB8AJI50Cv9tKmZfwcUcyAdmTr+vVvhsBCfvUAEokigSsgqgpYxfkJVxhJYeg==} + 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'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} + engines: {node: '>= 16'} + + '@apm-js-collab/code-transformer@0.8.2': + resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} + + '@apm-js-collab/tracing-hooks@0.3.1': + resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} + + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} - '@aws-crypto/crc32c@5.2.0': - resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + '@asamuzakjp/dom-selector@6.6.2': + resolution: {integrity: sha512-+AG0jN9HTwfDLBhjhX1FKi6zlIAc/YGgEHlN/OMaHD1pOPFsC5CpYQpLkPX0aFjyaVmoq9330cQDCU4qnSL1qA==} - '@aws-crypto/sha1-browser@5.2.0': - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -702,500 +748,389 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-ecs@3.637.0': - resolution: {integrity: sha512-/PcQKx4kBoWBpSu+10HXfU4LtUjTq92mCcJXYhjtlI8sQwkA1zvPThW0bjLJ34mIXhxvHSnUXG1NrjNZQ9ps4g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-ecs@3.908.0': + resolution: {integrity: sha512-HVgwoj/+VhM/7DWv7UgoKWP+AmtxCm1Tnc964+rCECzuSCcC3cYXOf0LZJLmaUxCQHLEzNuANsAMyl9jCzXenw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.687.0': - resolution: {integrity: sha512-2IoaVAd7HCIDhfeTTrk8CAosEVqnQig47Tra2uOBEyzpcCFQLmcY57/sbHCpJ3ntnU8see53q0bQ+fdew4MGLA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-sesv2@3.908.0': + resolution: {integrity: sha512-UfY1u1/dO0T1rmpCb7yzpoO5RZ4tQt+n1H0aLWG/QTQJR5rNraa3A2E1rqdMQKLEUaKoaOHUKdfriHsdkTyRYA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso-oidc@3.637.0': - resolution: {integrity: sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.637.0 + '@aws-sdk/client-sso@3.908.0': + resolution: {integrity: sha512-PseFMWvtac+Q+zaY9DMISE+2+glNh0ROJ1yR4gMzeafNHSwkdYu4qcgxLWIOnIodGydBv/tQ6nzHPzExXnUUgw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso-oidc@3.687.0': - resolution: {integrity: sha512-Rdd8kLeTeh+L5ZuG4WQnWgYgdv7NorytKdZsGjiag1D8Wv3PcJvPqqWdgnI0Og717BSXVoaTYaN34FyqFYSx6Q==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.687.0 + '@aws-sdk/core@3.908.0': + resolution: {integrity: sha512-okl6FC2cQT1Oidvmnmvyp/IEvqENBagKO0ww4YV5UtBkf0VlhAymCWkZqhovtklsqgq0otag2VRPAgnrMt6nVQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.637.0': - resolution: {integrity: sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-env@3.908.0': + resolution: {integrity: sha512-FK2YuxoI5CxUflPOIMbVAwDbi6Xvu+2sXopXLmrHc2PfI39M3vmjEoQwYCP8WuQSRb+TbAP3xAkxHjFSBFR35w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.687.0': - resolution: {integrity: sha512-dfj0y9fQyX4kFill/ZG0BqBTLQILKlL7+O5M4F9xlsh2WNuV2St6WtcOg14Y1j5UODPJiJs//pO+mD1lihT5Kw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-http@3.908.0': + resolution: {integrity: sha512-eLbz0geVW9EykujQNnYfR35Of8MreI6pau5K6XDFDUSWO9GF8wqH7CQwbXpXHBlCTHtq4QSLxzorD8U5CROhUw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.637.0': - resolution: {integrity: sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-ini@3.908.0': + resolution: {integrity: sha512-7Cgnv5wabgFtsgr+Uc/76EfPNGyxmbG8aICn3g3D3iJlcO4uuOZI8a77i0afoDdchZrTC6TG6UusS/NAW6zEoQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.687.0': - resolution: {integrity: sha512-SQjDH8O4XCTtouuCVYggB0cCCrIaTzUZIkgJUpOsIEJBLlTbNOb/BZqUShAQw2o9vxr2rCeOGjAQOYPysW/Pmg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-node@3.908.0': + resolution: {integrity: sha512-8OKbykpGw5bdfF/pLTf8YfUi1Kl8o1CTjBqWQTsLOkE3Ho3hsp1eQx8Cz4ttrpv0919kb+lox62DgmAOEmTr1w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.635.0': - resolution: {integrity: sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-process@3.908.0': + resolution: {integrity: sha512-sWnbkGjDPBi6sODUzrAh5BCDpnPw0wpK8UC/hWI13Q8KGfyatAmCBfr+9OeO3+xBHa8N5AskMncr7C4qS846yQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.686.0': - resolution: {integrity: sha512-Xt3DV4DnAT3v2WURwzTxWQK34Ew+iiLzoUoguvLaZrVMFOqMMrwVjP+sizqIaHp1j7rGmFcN5I8saXnsDLuQLA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-sso@3.908.0': + resolution: {integrity: sha512-WV/aOzuS6ZZhrkPty6TJ3ZG24iS8NXP0m3GuTVuZ5tKi9Guss31/PJ1CrKPRCYGm15CsIjf+mrUxVnNYv9ap5g==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.620.1': - resolution: {integrity: sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/credential-provider-web-identity@3.908.0': + resolution: {integrity: sha512-9xWrFn6nWlF5KlV4XYW+7E6F33S3wUUEGRZ/+pgDhkIZd527ycT2nPG2dZ3fWUZMlRmzijP20QIJDqEbbGWe1Q==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.686.0': - resolution: {integrity: sha512-osD7lPO8OREkgxPiTWmA1i6XEmOth1uW9HWWj/+A2YGCj1G/t2sHu931w4Qj9NWHYZtbTTXQYVRg+TErALV7nQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.901.0': + resolution: {integrity: sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.635.0': - resolution: {integrity: sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-logger@3.901.0': + resolution: {integrity: sha512-UoHebjE7el/tfRo8/CQTj91oNUm+5Heus5/a4ECdmWaSCHCS/hXTsU3PTTHAY67oAQR8wBLFPfp3mMvXjB+L2A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.686.0': - resolution: {integrity: sha512-xyGAD/f3vR/wssUiZrNFWQWXZvI4zRm2wpHhoHA1cC2fbRMNFYtFn365yw6dU7l00ZLcdFB1H119AYIUZS7xbw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-recursion-detection@3.901.0': + resolution: {integrity: sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.637.0': - resolution: {integrity: sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.637.0 + '@aws-sdk/middleware-sdk-s3@3.908.0': + resolution: {integrity: sha512-23MbAOHsGaD0kTVMVLumaIM1f9vtDImIn2lSvPullbjFHKS4XxfrKuPumtKDzl8gzcux+98XnmfDRKH0fzkOUA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.687.0': - resolution: {integrity: sha512-6d5ZJeZch+ZosJccksN0PuXv7OSnYEmanGCnbhUqmUSz9uaVX6knZZfHCZJRgNcfSqg9QC0zsFA/51W5HCUqSQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.687.0 + '@aws-sdk/middleware-user-agent@3.908.0': + resolution: {integrity: sha512-R0ePEOku72EvyJWy/D0Z5f/Ifpfxa0U9gySO3stpNhOox87XhsILpcIsCHPy0OHz1a7cMoZsF6rMKSzDeCnogQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.637.0': - resolution: {integrity: sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/nested-clients@3.908.0': + resolution: {integrity: sha512-ZxDYrfxOKXNFHLyvJtT96TJ0p4brZOhwRE4csRXrezEVUN+pNgxuem95YvMALPVhlVqON2CTzr8BX+CcBKvX9Q==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.687.0': - resolution: {integrity: sha512-Pqld8Nx11NYaBUrVk3bYiGGpLCxkz8iTONlpQWoVWFhSOzlO7zloNOaYbD2XgFjjqhjlKzE91drs/f41uGeCTA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.901.0': + resolution: {integrity: sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.620.1': - resolution: {integrity: sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/signature-v4-multi-region@3.908.0': + resolution: {integrity: sha512-8OodflIzZM2GVuCGiGK6hqwsbfHRDl4kQcEYzHRg9p91H4h5Y876DPvLRkwM7pSC7LKUL0XkKWWVVjwJbp6/Ig==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.686.0': - resolution: {integrity: sha512-sXqaAgyzMOc+dm4CnzAR5Q6S9OWVHyZjLfW6IQkmGjqeQXmZl24c4E82+w64C+CTkJrFLzH1VNOYp1Hy5gE6Qw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/token-providers@3.908.0': + resolution: {integrity: sha512-4SosHWRQ8hj1X2yDenCYHParcCjHcd7S+Mdb/lelwF0JBFCNC+dNCI9ws3cP/dFdZO/AIhJQGUBzEQtieloixw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.637.0': - resolution: {integrity: sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/types@3.901.0': + resolution: {integrity: sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.687.0': - resolution: {integrity: sha512-N1YCoE7DovIRF2ReyRrA4PZzF0WNi4ObPwdQQkVxhvSm7PwjbWxrfq7rpYB+6YB1Uq3QPzgVwUFONE36rdpxUQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.621.0': - resolution: {integrity: sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.621.0 + '@aws-sdk/util-endpoints@3.901.0': + resolution: {integrity: sha512-5nZP3hGA8FHEtKvEQf4Aww5QZOkjLW1Z+NixSd+0XKfHvA39Ah5sZboScjLx0C9kti/K3OGW1RCx5K9Zc3bZqg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.686.0': - resolution: {integrity: sha512-40UqCpPxyHCXDP7CGd9JIOZDgDZf+u1OyLaGBpjQJlz1HYuEsIWnnbTe29Yg3Ah/Zc3g4NBWcUdlGVotlnpnDg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.686.0 + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/lib-storage@3.687.0': - resolution: {integrity: sha512-LAJOH1Ddm8vlA6j8WyFAt1Ithfj58XuJN1d2WJSDZLhGDGQp3+nDFzovOKODw/Bc9x6ZnDYm9rE+QMTbGSvqkA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-browser@3.907.0': + resolution: {integrity: sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ==} + + '@aws-sdk/util-user-agent-node@3.908.0': + resolution: {integrity: sha512-l6AEaKUAYarcEy8T8NZ+dNZ00VGLs3fW2Cqu1AuPENaSad0/ahEU+VU7MpXS8FhMRGPgplxKVgCTLyTY0Lbssw==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/client-s3': ^3.687.0 + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true - '@aws-sdk/middleware-bucket-endpoint@3.686.0': - resolution: {integrity: sha512-6qCoWI73/HDzQE745MHQUYz46cAQxHCgy1You8MZQX9vHAQwqBnkcsb2hGp7S6fnQY5bNsiZkMWVQ/LVd2MNjg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/xml-builder@3.901.0': + resolution: {integrity: sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.686.0': - resolution: {integrity: sha512-5yYqIbyhLhH29vn4sHiTj7sU6GttvLMk3XwCmBXjo2k2j3zHqFUwh9RyFGF9VY6Z392Drf/E/cl+qOGypwULpg==} - engines: {node: '>=16.0.0'} + '@aws/lambda-invoke-store@0.0.1': + resolution: {integrity: sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.687.0': - resolution: {integrity: sha512-hsEr3eiJs7gOzj9nDMCMfhLkoYv4Z8m7fbic63TkeyimXvsHycqqF6PX0TkPykwa1ueyxVpz0vtO5u1rlucN2w==} - engines: {node: '>=16.0.0'} + '@axe-core/playwright@4.10.2': + resolution: {integrity: sha512-6/b5BJjG6hDaRNtgzLIfKr5DfwyiLHO4+ByTLB0cJgWSM8Ll7KqtdblIS6bEkwSF642/Ex91vNqIl3GLXGlceg==} + peerDependencies: + playwright-core: '>= 1.0.0' - '@aws-sdk/middleware-host-header@3.620.0': - resolution: {integrity: sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==} - engines: {node: '>=16.0.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-host-header@3.686.0': - resolution: {integrity: sha512-+Yc6rO02z+yhFbHmRZGvEw1vmzf/ifS9a4aBjJGeVVU+ZxaUvnk+IUZWrj4YQopUQ+bSujmMUzJLXSkbDq7yuw==} - engines: {node: '>=16.0.0'} + '@babel/compat-data@7.28.4': + resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-location-constraint@3.686.0': - resolution: {integrity: sha512-pCLeZzt5zUGY3NbW4J/5x3kaHyJEji4yqtoQcUlJmkoEInhSxJ0OE8sTxAfyL3nIOF4yr6L2xdaLCqYgQT8Aog==} - engines: {node: '>=16.0.0'} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-logger@3.609.0': - resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==} - engines: {node: '>=16.0.0'} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-logger@3.686.0': - resolution: {integrity: sha512-cX43ODfA2+SPdX7VRxu6gXk4t4bdVJ9pkktbfnkE5t27OlwNfvSGGhnHrQL8xTOFeyQ+3T+oowf26gf1OI+vIg==} - engines: {node: '>=16.0.0'} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-recursion-detection@3.620.0': - resolution: {integrity: sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==} - engines: {node: '>=16.0.0'} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} - '@aws-sdk/middleware-recursion-detection@3.686.0': - resolution: {integrity: sha512-jF9hQ162xLgp9zZ/3w5RUNhmwVnXDBlABEUX8jCgzaFpaa742qR/KKtjjZQ6jMbQnP+8fOCSXFAVNMU+s6v81w==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.687.0': - resolution: {integrity: sha512-YGHYqiyRiNNucmvLrfx3QxIkjSDWR/+cc72bn0lPvqFUQBRHZgmYQLxVYrVZSmRzzkH2FQ1HsZcXhOafLbq4vQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-ssec@3.686.0': - resolution: {integrity: sha512-zJXml/CpVHFUdlGQqja87vNQ3rPB5SlDbfdwxlj1KBbjnRRwpBtxxmOlWRShg8lnVV6aIMGv95QmpIFy4ayqnQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.637.0': - resolution: {integrity: sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.687.0': - resolution: {integrity: sha512-nUgsKiEinyA50CaDXojAkOasAU3Apdg7Qox6IjNUC4ZjgOu7QWsCDB5N28AYMUt06cNYeYQdfMX1aEzG85a1Mg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.614.0': - resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.686.0': - resolution: {integrity: sha512-6zXD3bSD8tcsMAVVwO1gO7rI1uy2fCD3czgawuPGPopeLiPpo6/3FoUWCQzk2nvEhj7p9Z4BbjwZGSlRkVrXTw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/s3-request-presigner@3.687.0': - resolution: {integrity: sha512-/fX3F4nYjVEgdlVamsb2tDgnFA5dtzxkeN+hH91e+ZoBMJBow+FUb2EEtjloreGUynPx6E00UxdDXIKWmt99lA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.687.0': - resolution: {integrity: sha512-vdOQHCRHJPX9mT8BM6xOseazHD6NodvHl9cyF5UjNtLn+gERRJEItIA9hf0hlt62odGD8Fqp+rFRuqdmbNkcNw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/token-providers@3.614.0': - resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.614.0 - - '@aws-sdk/token-providers@3.686.0': - resolution: {integrity: sha512-9oL4kTCSePFmyKPskibeiOXV6qavPZ63/kXM9Wh9V6dTSvBtLeNnMxqGvENGKJcTdIgtoqyqA6ET9u0PJ5IRIg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.686.0 - - '@aws-sdk/types@3.609.0': - resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/types@3.686.0': - resolution: {integrity: sha512-xFnrb3wxOoJcW2Xrh63ZgFo5buIu9DF7bOHnwoUxHdNpUXicUh0AHw85TjXxyxIAd0d1psY/DU7QHoNI3OswgQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-arn-parser@3.679.0': - resolution: {integrity: sha512-CwzEbU8R8rq9bqUFryO50RFBlkfufV9UfMArHPWlo+lmsC+NlSluHQALoj6Jkq3zf5ppn1CN0c1DDLrEqdQUXg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.637.0': - resolution: {integrity: sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.686.0': - resolution: {integrity: sha512-7msZE2oYl+6QYeeRBjlDgxQUhq/XRky3cXE0FqLFs2muLS7XSuQEXkpOXB3R782ygAP6JX0kmBxPTLurRTikZg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-format-url@3.686.0': - resolution: {integrity: sha512-9doB6O4FAlnWZrvnFDUxTtSFtuL8kUqxlP00HTiDgL1uDJZ8e0S4gqjKR+9+N5goFtxGi7IJeNsDEz2H7imvgw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-locate-window@3.568.0': - resolution: {integrity: sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-user-agent-browser@3.609.0': - resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==} - - '@aws-sdk/util-user-agent-browser@3.686.0': - resolution: {integrity: sha512-YiQXeGYZegF1b7B2GOR61orhgv79qmI0z7+Agm3NXLO6hGfVV3kFUJbXnjtH1BgWo5hbZYW7HQ2omGb3dnb6Lg==} - - '@aws-sdk/util-user-agent-node@3.614.0': - resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/util-user-agent-node@3.687.0': - resolution: {integrity: sha512-idkP6ojSTZ4ek1pJ8wIN7r9U3KR5dn0IkJn3KQBXQ58LWjkRqLtft2vxzdsktWwhPKjjmIKl1S0kbvqLawf8XQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.686.0': - resolution: {integrity: sha512-k0z5b5dkYSuOHY0AOZ4iyjcGBeVL9lWsQNF4+c+1oK3OW4fRWl/bNa1soMRMpangsHPzgyn/QkzuDbl7qR4qrw==} - engines: {node: '>=16.0.0'} - - '@axe-core/playwright@4.10.0': - resolution: {integrity: sha512-kEr3JPEVUSnKIYp/egV2jvFj+chIjCjPp3K3zlpJMza/CB3TFw8UZNbI9agEC2uMz4YbgAOyzlbUy0QS+OofFA==} - peerDependencies: - playwright-core: '>= 1.0.0' - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.25.5': - resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.9': - resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.4': - resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/parser@7.25.4': - resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-decorators@7.24.7': - resolution: {integrity: sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.24.7': - resolution: {integrity: sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.7': - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} - engines: {node: '>=6.9.0'} + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.4': - resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.25.2': - resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.4': - resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/standalone@7.25.5': - resolution: {integrity: sha512-46bI7GJHwgWfWszOWMvJIsJjXd+LBMIlaiw4R54+b7GvDfxTVE6ytsqR8uEiI/zYECoB33ChwfN0wq/MLHLFXg==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/standalone@7.26.2': - resolution: {integrity: sha512-i2VbegsRfwa9yq3xmfDX3tG2yh9K0cCqwpSyVG2nPxifh0EOnucAZUeO/g4lW2Zfg03aPJNtPfxQbDHzXc7H+w==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@babel/traverse@7.25.4': - resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} - engines: {node: '>=6.9.0'} + '@borewit/text-codec@0.1.1': + resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} - engines: {node: '>=6.9.0'} + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} - '@babel/types@7.25.4': - resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} - engines: {node: '>=6.9.0'} + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} - engines: {node: '>=6.9.0'} + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.14': + resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 - '@cloudflare/kv-asset-handler@0.3.4': - resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} - engines: {node: '>=16.13'} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} - '@docsearch/css@3.6.2': - resolution: {integrity: sha512-vKNZepO2j7MrYBTZIGXvlUOIR+v9KRf70FApRgovWrj3GTs1EITz/Xb0AOlm1xsQBp16clVZj1SY/qaOJbQtZw==} + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} - '@docsearch/js@3.6.2': - resolution: {integrity: sha512-pS4YZF+VzUogYrkblCucQ0Oy2m8Wggk8Kk7lECmZM60hTbaydSIhJTTiCrmoxtBqV8wxORnOqcqqOfbmkkQEcA==} + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} - '@docsearch/react@3.6.2': - resolution: {integrity: sha512-rtZce46OOkVflCQH71IdbXSFK+S8iJZlUF56XBW5rIgx/eG5qoomC7Ag3anZson1bBac/JFQn7XOBfved/IMRA==} + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -1211,9 +1146,18 @@ packages: search-insights: optional: true - '@es-joy/jsdoccomment@0.49.0': - resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} - engines: {node: '>=16'} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@es-joy/jsdoccomment@0.56.0': + resolution: {integrity: sha512-c6EW+aA1w2rjqOMjbL93nZlwxp6c1Ln06vTYs5FjRRhmJXK8V/OrSXdT+pUr4aRYgjCgu8/OkiZr0tzeVrRSbw==} + engines: {node: '>=20.11.0'} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -1221,14 +1165,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1239,14 +1177,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1257,14 +1189,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1275,14 +1201,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1293,14 +1213,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1311,14 +1225,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1329,14 +1237,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1347,14 +1249,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1365,14 +1261,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1383,14 +1273,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1401,14 +1285,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1419,14 +1297,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1437,14 +1309,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1455,14 +1321,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1473,14 +1333,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1491,14 +1345,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1509,17 +1357,17 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} - cpu: [x64] - os: [linux] + cpu: [arm64] + os: [netbsd] '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} @@ -1527,26 +1375,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1557,17 +1393,17 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + cpu: [arm64] + os: [openharmony] '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} @@ -1575,14 +1411,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1593,14 +1423,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1611,14 +1435,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1629,20 +1447,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1651,152 +1463,403 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.2.2': - resolution: {integrity: sha512-jhgiIrsw+tRfcBQ4BFl2C3vCrIUw2trCY0cnDvGZpwTtKCEDmZhAtMfrEUP/KpnwM6PrO0T+Ltm+ccW74olG3Q==} + '@eslint/compat@1.4.0': + resolution: {integrity: sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^9.10.0 + eslint: ^8.40 || 9 peerDependenciesMeta: eslint: optional: true - '@eslint/config-array@0.18.0': - resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.7.0': - resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + '@eslint/config-helpers@0.4.0': + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.14.0': - resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.2': - resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} + '@eslint/js@9.37.0': + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@faker-js/faker@8.4.1': - resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@grpc/grpc-js@1.11.1': - resolution: {integrity: sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==} - engines: {node: '>=12.10.0'} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@grpc/proto-loader@0.7.13': - resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} - engines: {node: '>=6'} - hasBin: true + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@hapi/boom@10.0.1': - resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==} + '@faker-js/faker@10.0.0': + resolution: {integrity: sha512-UollFEUkVXutsaP+Vndjxar40Gs5JL2HeLcl8xO1QAjJgOdhc3OmBFWyEylS+RddWaaBiAzH+5/17PLQJwDiLw==} + engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} - '@hapi/bourne@3.0.0': - resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + '@fastify/error@4.2.0': + resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} - '@hapi/hoek@11.0.4': - resolution: {integrity: sha512-PnsP5d4q7289pS2T2EgGz147BFJ2Jpb4yrEdkpz2IhgEUzos1S7HTl7ezWh1yfYzYlj89KzLdCRkqsP6SIryeQ==} + '@grpc/grpc-js@1.14.0': + resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} + engines: {node: '>=12.10.0'} - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + + '@hapi/address@5.1.1': + resolution: {integrity: sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==} + engines: {node: '>=14.0.0'} - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@hapi/formula@3.0.2': + resolution: {integrity: sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==} + + '@hapi/hoek@11.0.7': + resolution: {integrity: sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==} + + '@hapi/pinpoint@2.0.1': + resolution: {integrity: sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==} + + '@hapi/tlds@1.1.3': + resolution: {integrity: sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==} + engines: {node: '>=14.0.0'} - '@hapi/wreck@18.1.0': - resolution: {integrity: sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==} + '@hapi/topo@6.0.2': + resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} - engines: {node: '>=18.18'} - - '@iconify-json/simple-icons@1.2.11': - resolution: {integrity: sha512-AHCGDtBRqP+JzAbBzgO8uN/08CXxEmuaC6lQQZ3b5burKhRU12AJnJczwbUw2K5Mb/U85EpSUNhYMG3F28b8NA==} + '@iconify-json/simple-icons@1.2.54': + resolution: {integrity: sha512-OQQYl8yC5j3QklZOYnK31QYe5h47IhyCoxSLd53f0e0nA4dgi8VOZS30SgSAbsecQ+S0xlGJMjXIHTIqZ+ML3w==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@inquirer/core@9.0.10': - resolution: {integrity: sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==} + '@inquirer/ansi@1.0.0': + resolution: {integrity: sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.2.4': + resolution: {integrity: sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.18': + resolution: {integrity: sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.2.2': + resolution: {integrity: sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.20': + resolution: {integrity: sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.20': + resolution: {integrity: sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/input@4.2.4': + resolution: {integrity: sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.20': + resolution: {integrity: sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.20': + resolution: {integrity: sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==} + 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/prompts@7.8.0': + resolution: {integrity: sha512-JHwGbQ6wjf1dxxnalDYpZwZxUEosT+6CPGD9Zh4sm9WXdtUp9XODCQD3NjSTmu+0OAyxWXNOqf0spjIymJa2Tw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.8.6': + resolution: {integrity: sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.8': + resolution: {integrity: sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/figures@1.0.5': - resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + '@inquirer/search@3.1.3': + resolution: {integrity: sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/select@2.4.7': - resolution: {integrity: sha512-JH7XqPEkBpNWp3gPCqWqY8ECbyMoFcCZANlL6pV9hf59qK6dGmkOlx1ydyhY+KZ0c5X74+W6Mtp+nm2QX0/MAQ==} + '@inquirer/select@4.3.4': + resolution: {integrity: sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@inquirer/type@1.5.2': - resolution: {integrity: sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==} + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@ioredis/commands@1.4.0': + resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} - '@ioredis/commands@1.2.0': - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jercle/yargonaut@1.1.5': + resolution: {integrity: sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==} + + '@jest/console@30.2.0': + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.2.0': + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/environment@30.2.0': + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.2.0': + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.2.0': + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/fake-timers@30.2.0': + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.1.0': + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.2.0': + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.2.0': + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.2.0': + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.2.0': + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.2.0': + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/transform@30.2.0': + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@keyv/redis@3.0.1': - resolution: {integrity: sha512-eyqzomQC76LjUOEkPP8rdR2Fk4eZBSS0Ma47i7CNiQuv8NCw3trZvghx8L5Xruk7XPEj/eRAMrAxP//xQFOPdQ==} - engines: {node: '>= 18'} - - '@keyv/serialize@1.0.1': - resolution: {integrity: sha512-kKXeynfORDGPUEEl2PvTExM2zs+IldC6ZD8jPcfvI351MDNtfMlw9V9s4XZXuJNDK2qR5gbEKxRyoYx3quHUVQ==} + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -1804,432 +1867,1188 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@logdna/tail-file@2.2.0': - resolution: {integrity: sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng==} - engines: {node: '>=10.3.0'} + '@libsql/client@0.15.15': + resolution: {integrity: sha512-twC0hQxPNHPKfeOv3sNT6u2pturQjLcI+CnpTM0SjRpocEGgfiZ7DWKXLNnsothjyJmDqEsBQJ5ztq9Wlu470w==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true + '@libsql/core@0.15.15': + resolution: {integrity: sha512-C88Z6UKl+OyuKKPwz224riz02ih/zHYI3Ho/LAcVOgjsunIRZoBw7fjRfaH9oPMmSNeQfhGklSG2il1URoOIsA==} - '@mdi/font@7.4.47': - resolution: {integrity: sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==} + '@libsql/darwin-arm64@0.5.22': + resolution: {integrity: sha512-4B8ZlX3nIDPndfct7GNe0nI3Yw6ibocEicWdC4fvQbSs/jdq/RC2oCsoJxJ4NzXkvktX70C1J4FcmmoBy069UA==} + cpu: [arm64] + os: [darwin] - '@netlify/functions@2.8.2': - resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==} - engines: {node: '>=14.0.0'} + '@libsql/darwin-x64@0.5.22': + resolution: {integrity: sha512-ny2HYWt6lFSIdNFzUFIJ04uiW6finXfMNJ7wypkAD8Pqdm6nAByO+Fdqu8t7sD0sqJGeUCiOg480icjyQ2/8VA==} + cpu: [x64] + os: [darwin] - '@netlify/node-cookies@0.1.0': - resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} - engines: {node: ^14.16.0 || >=16.0.0} + '@libsql/hrana-client@0.7.0': + resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==} - '@netlify/serverless-functions-api@1.26.1': - resolution: {integrity: sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==} + '@libsql/isomorphic-fetch@0.3.1': + resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==} engines: {node: '>=18.0.0'} - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/agent@2.2.2': - resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} - engines: {node: ^16.14.0 || >=18.0.0} + '@libsql/isomorphic-ws@0.1.5': + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - '@npmcli/arborist@7.5.4': - resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true + '@libsql/linux-arm-gnueabihf@0.5.22': + resolution: {integrity: sha512-3Uo3SoDPJe/zBnyZKosziRGtszXaEtv57raWrZIahtQDsjxBVjuzYQinCm9LRCJCUT5t2r5Z5nLDPJi2CwZVoA==} + cpu: [arm] + os: [linux] - '@npmcli/fs@3.1.1': - resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@libsql/linux-arm-musleabihf@0.5.22': + resolution: {integrity: sha512-LCsXh07jvSojTNJptT9CowOzwITznD+YFGGW+1XxUr7fS+7/ydUrpDfsMX7UqTqjm7xG17eq86VkWJgHJfvpNg==} + cpu: [arm] + os: [linux] - '@npmcli/git@5.0.8': - resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@libsql/linux-arm64-gnu@0.5.22': + resolution: {integrity: sha512-KSdnOMy88c9mpOFKUEzPskSaF3VLflfSUCBwas/pn1/sV3pEhtMF6H8VUCd2rsedwoukeeCSEONqX7LLnQwRMA==} + cpu: [arm64] + os: [linux] - '@npmcli/installed-package-contents@2.1.0': - resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + '@libsql/linux-arm64-musl@0.5.22': + resolution: {integrity: sha512-mCHSMAsDTLK5YH//lcV3eFEgiR23Ym0U9oEvgZA0667gqRZg/2px+7LshDvErEKv2XZ8ixzw3p1IrBzLQHGSsw==} + cpu: [arm64] + os: [linux] - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@libsql/linux-x64-gnu@0.5.22': + resolution: {integrity: sha512-kNBHaIkSg78Y4BqAdgjcR2mBilZXs4HYkAmi58J+4GRwDQZh5fIUWbnQvB9f95DkWUIGVeenqLRFY2pcTmlsew==} + cpu: [x64] + os: [linux] - '@npmcli/metavuln-calculator@7.1.1': - resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@libsql/linux-x64-musl@0.5.22': + resolution: {integrity: sha512-UZ4Xdxm4pu3pQXjvfJiyCzZop/9j/eA2JjmhMaAhe3EVLH2g11Fy4fwyUp9sT1QJYR1kpc2JLuybPM0kuXv/Tg==} + cpu: [x64] + os: [linux] - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@libsql/win32-x64-msvc@0.5.22': + resolution: {integrity: sha512-Fj0j8RnBpo43tVZUVoNK6BV/9AtDUM5S7DF3LB4qTYg1LMSZqi3yeCneUTLJD6XomQJlZzbI4mst89yspVSAnA==} + cpu: [x64] + os: [win32] - '@npmcli/node-gyp@3.0.0': - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@logdna/tail-file@2.2.0': + resolution: {integrity: sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng==} + engines: {node: '>=10.3.0'} - '@npmcli/package-json@5.2.0': - resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} - '@npmcli/promise-spawn@7.0.2': - resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@mapbox/node-pre-gyp@2.0.0': + resolution: {integrity: sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==} + engines: {node: '>=18'} + hasBin: true - '@npmcli/query@3.1.0': - resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@mdi/font@7.4.47': + resolution: {integrity: sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==} - '@npmcli/redact@2.0.1': - resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@microsoft/tsdoc@0.15.1': + resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@npmcli/run-script@8.1.0': - resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@mikro-orm/cli@6.5.8': + resolution: {integrity: sha512-QM3Pvnu833XbnB8eUlnH2sTq5FEkeMbGqXwOWREY6A8Od/PPRtVmBsKsGS3pX88gz7e03pZnwRW7NNy38V9zdA==} + engines: {node: '>= 18.12.0'} + hasBin: true - '@nuxt/devalue@2.0.2': - resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} + '@mikro-orm/core@6.5.8': + resolution: {integrity: sha512-0jym5Pd7AwjpzsgPvs5c1WhrqqsfD2K32UcDmsN0CVU0uXCgKKEfXWnAHsesvUBghg0pKzFhTonI2G6I1GYYUA==} + engines: {node: '>= 18.12.0'} - '@nuxt/devtools-kit@1.3.14': - resolution: {integrity: sha512-mLPuCf5nFYLm/1JD0twt8qfFGwoVhTRA4Zx9CPiyWCQNf7XJXb3TfhCm89vHpcPP+9T6ulZxRJp+JZETjXY8+A==} + '@mikro-orm/knex@6.5.8': + resolution: {integrity: sha512-/+/jc5zlOgdRlq/SC5RHGdIgrJw7TsGSICumYq6+dauYq2ChMHw3rrN1mW7bKkS/A2oB8eabyNyUj2WKOC3PKA==} + engines: {node: '>= 18.12.0'} peerDependencies: - vite: '*' + '@mikro-orm/core': ^6.0.0 + better-sqlite3: '*' + libsql: '*' + mariadb: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + libsql: + optional: true + mariadb: + optional: true - '@nuxt/devtools-kit@1.6.0': - resolution: {integrity: sha512-kJ8mVKwTSN3tdEVNy7mxKCiQk9wsG5t3oOrRMWk6IEbTSov+5sOULqQSM/+OWxWsEDmDfA7QlS5sM3Ti9uMRqQ==} + '@mikro-orm/libsql@6.5.8': + resolution: {integrity: sha512-dWJf9wIcFhYNF3zodYQVMp+9ZglxAz+5Gp75bV3yBlEAKGWBxUgnX8vpTl1ZoU+2zzpZYOVvLw0cggecQa3iVQ==} + engines: {node: '>= 18.12.0'} peerDependencies: - vite: '*' + '@mikro-orm/core': ^6.0.0 - '@nuxt/devtools-wizard@1.3.14': - resolution: {integrity: sha512-5kLB53/7YUME6Y8byrOxRhl0hXWm05jPStJd1CJHKDcGrp+hjxYZaSgEwYtEIQ0A1GF04rfL4bJ+qIL+7e0+9Q==} - hasBin: true - - '@nuxt/devtools-wizard@1.6.0': - resolution: {integrity: sha512-n+mzz5NwnKZim0tq1oBi+x1nNXb21fp7QeBl7bYKyDT1eJ0XCxFkVTr/kB/ddkkLYZ+o8TykpeNPa74cN+xAyQ==} - hasBin: true + '@mikro-orm/migrations@6.5.8': + resolution: {integrity: sha512-KQu+dovQ0KMooGzoBb8FP8n32AvrdN5NB4pGFmT6AxNchSnRxeLDRSN2aHDHHMwu+Duy0HgXnMgQ540VZ0ioqQ==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@mikro-orm/core': ^6.0.0 - '@nuxt/devtools@1.3.14': - resolution: {integrity: sha512-ebeVWBisXbhJ7begAZTgSDF8cPbExHv4RPDb9fWTMI1YoVVxX+elqUPw0K6T5Yi4atdGhyxRtGMqjikl7QKp9w==} - hasBin: true + '@mikro-orm/nestjs@6.1.1': + resolution: {integrity: sha512-aluD3eTeuCvIePDk5UBanHIhu1zAJQXqWAg47MZdHJmFkNuXn62DCXbD2c4X5TCpKW/m0zjba22ilyZ/AFG9qg==} + engines: {node: '>= 18.12.0'} peerDependencies: - vite: '*' + '@mikro-orm/core': ^6.0.0 || ^6.0.0-dev.0 || ^7.0.0-dev.0 + '@nestjs/common': ^10.0.0 || ^11.0.5 + '@nestjs/core': ^10.0.0 || ^11.0.5 - '@nuxt/devtools@1.6.0': - resolution: {integrity: sha512-xNorMapzpM8HaW7NnAsEEO38OrmrYBzGvkkqfBU5nNh5XEymmIfCbQc7IA/GIOH9pXOV4gRutCjHCWXHYbOl3A==} - hasBin: true + '@mikro-orm/postgresql@6.5.8': + resolution: {integrity: sha512-NeQqI8J/QyzqgLPvdOd26TSkefYjLUfFeLUEQ2DeT/yKJd/SF0re1OfYZrqsKve8VIz8MHu6HiVBvz3iZvhfDw==} + engines: {node: '>= 18.12.0'} peerDependencies: - vite: '*' + '@mikro-orm/core': ^6.0.0 - '@nuxt/eslint-config@0.6.1': - resolution: {integrity: sha512-AgWCX4iZtUgEiuTi+Azt5/zl8gAwW421BzhkcHmVzCVJgyKvZHNrrWUmlwwbE7iD9ZydKGSPeszSxBehf6F5jA==} + '@mikro-orm/reflection@6.5.8': + resolution: {integrity: sha512-Dgq5BE7tx/yguv9n42zv9ysxuo9N2GORugrMTkO/Y1jo6Yxnde2EmzHjeUhakoWwirkKZ3u/wCHxBZtQgti0xQ==} + engines: {node: '>= 18.12.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + '@mikro-orm/core': ^6.0.0 - '@nuxt/eslint-plugin@0.6.1': - resolution: {integrity: sha512-fg8NWhiksBEgTQEQrTNbmgmVQFKDXZh+QaivTyxiBLSct8WXBp6d6/3586SIzKzBQFtP62xThK3yzy0AjMHs2Q==} + '@mikro-orm/seeder@6.5.8': + resolution: {integrity: sha512-EVfXNJ+Q7I1jKLlYwWDdQ/67DxhuBSfS2U/XKKo/+uEaxGBl5vDe8kV3RNRwx8I9x6DHsQpt1NzJL+JS3fSt3w==} + engines: {node: '>= 18.12.0'} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + '@mikro-orm/core': ^6.0.0 - '@nuxt/kit@3.13.0': - resolution: {integrity: sha512-gbhSbDvYfkGQ0R2ztqTLQLHRMv+7g50kAKKuN6mbF4tL9jg7NPnQ8bAarn2I4Qx8xtmwO+qY1ABkmYMn5S1CpA==} - engines: {node: ^14.18.0 || >=16.10.0} + '@mikro-orm/sql-highlighter@1.0.1': + resolution: {integrity: sha512-iO+FwRNuqNDVlIo5zfgOu2mMGVicX/FqzP+F/A0xpJLHyqvWyXzVwntgAMimBjQaxiX9Rpmc0u3Jq6/A6V6JQA==} + engines: {node: '>= 10.13.0'} - '@nuxt/kit@3.14.159': - resolution: {integrity: sha512-ZqxsCI1NKV/gjfEUUZjMcr82sg0MKYZOuyB6bu9QY5Zr7NGpfIZY/z5Z822AKTmFxKGChnuz9M0UaS4ze6p42g==} - engines: {node: ^14.18.0 || >=16.10.0} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@nuxt/schema@3.13.0': - resolution: {integrity: sha512-JBGSjF9Hd8guvTV2312eM1RulCMJc50yR3CeMZPLDsI02A8TXQnABS8EbgvGRvxD43q/ITjj21B2ffG1wEVrnQ==} - engines: {node: ^14.18.0 || >=16.10.0} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@nuxt/schema@3.14.159': - resolution: {integrity: sha512-ggXA3F2f9udQoEy5WwrY6bTMvpDaErUYRLSEzdMqqCqjOQ5manfFgfuScGj3ooZiXLIX2TGLVTzcll4nnpDlnQ==} - engines: {node: ^14.18.0 || >=16.10.0} + '@neon-rs/load@0.0.4': + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - '@nuxt/telemetry@2.6.0': - resolution: {integrity: sha512-h4YJ1d32cU7tDKjjhjtIIEck4WF/w3DTQBT348E9Pz85YLttnLqktLM0Ez9Xc2LzCeUgBDQv1el7Ob/zT3KUqg==} + '@nestjs/cli@11.0.10': + resolution: {integrity: sha512-4waDT0yGWANg0pKz4E47+nUrqIJv/UqrZ5wLPkCqc7oMGRMWKAaw1NDZ9rKsaqhqvxb2LfI5+uXOWr4yi94DOQ==} + engines: {node: '>= 20.11'} hasBin: true - - '@nuxt/vite-builder@3.13.0': - resolution: {integrity: sha512-FVIpT5wTxGcU3JDFxIyvT6isSZUujVKavQyPo3kgOQKWURDcBcvVY4HdJIVMsSIcaXafH13RZc5RKLlxfIGFdQ==} - engines: {node: ^14.18.0 || >=16.10.0} peerDependencies: - vue: ^3.3.4 - + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@11.1.6': + resolution: {integrity: sha512-krKwLLcFmeuKDqngG2N/RuZHCs2ycsKcxWIDgcm7i1lf3sQ0iG03ci+DsP/r3FcT/eJDFsIHnKtNta2LIi7PzQ==} + 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/config@4.0.2': + resolution: {integrity: sha512-McMW6EXtpc8+CwTUwFdg6h7dYcBUpH5iUILCclAsa+MbCEvC9ZKu4dCHRlJqALuhjLw97pbQu62l4+wRwGeZqA==} + peerDependencies: + '@nestjs/common': ^10.0.0 || ^11.0.0 + rxjs: ^7.1.0 + + '@nestjs/core@11.1.6': + resolution: {integrity: sha512-siWX7UDgErisW18VTeJA+x+/tpNZrJewjTBsRPF3JVxuWRuAB1kRoiJcxHgln8Lb5UY9NdvklITR84DUEXD0Cg==} + 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/jwt@11.0.1': + resolution: {integrity: sha512-HXSsc7SAnCnjA98TsZqrE7trGtHDnYXWp4Ffy6LwSmck1QvbGYdMzBquXofX5l6tIRpeY4Qidl2Ti2CVG77Pdw==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + + '@nestjs/mapped-types@2.1.0': + resolution: {integrity: sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==} + 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 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/passport@11.0.5': + resolution: {integrity: sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==} + peerDependencies: + '@nestjs/common': ^10.0.0 || ^11.0.0 + passport: ^0.5.0 || ^0.6.0 || ^0.7.0 + + '@nestjs/platform-express@11.1.6': + resolution: {integrity: sha512-HErwPmKnk+loTq8qzu1up+k7FC6Kqa8x6lJ4cDw77KnTxLzsCaPt+jBvOq6UfICmfqcqCCf3dKXg+aObQp+kIQ==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + + '@nestjs/schematics@11.0.9': + resolution: {integrity: sha512-0NfPbPlEaGwIT8/TCThxLzrlz3yzDNkfRNpbL7FiplKq3w4qXpJg0JYwqgMEJnLQZm3L/L/5XjoyfJHUO3qX9g==} + peerDependencies: + typescript: '>=4.8.2' + + '@nestjs/serve-static@5.0.4': + resolution: {integrity: sha512-3kO1M9D3vsPyWPFardxIjUYeuolS58PnhCoBTkS7t3BrdZFZCKHnBZ15js+UOzOR2Q6HmD7ssGjLd0DVYVdvOw==} + peerDependencies: + '@fastify/static': ^8.0.4 + '@nestjs/common': ^11.0.2 + '@nestjs/core': ^11.0.2 + express: ^5.0.1 + fastify: ^5.2.1 + peerDependenciesMeta: + '@fastify/static': + optional: true + express: + optional: true + fastify: + optional: true + + '@nestjs/swagger@11.2.0': + resolution: {integrity: sha512-5wolt8GmpNcrQv34tIPUtPoV1EeFbCetm40Ij3+M0FNNnf2RJ3FyWfuQvI8SBlcJyfaounYVTKzKHreFXsUyOg==} + peerDependencies: + '@fastify/static': ^8.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 + + '@nestjs/testing@11.1.6': + resolution: {integrity: sha512-srYzzDNxGvVCe1j0SpTS9/ix75PKt6Sn6iMaH1rpJ6nj2g8vwNrhK0CoJJXvpCYgrnI+2WES2pprYnq8rAMYHA==} + peerDependencies: + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nestjs/throttler@6.4.0': + resolution: {integrity: sha512-osL67i0PUuwU5nqSuJjtUJZMkxAnYB4VldgYUMGzvYRJDCqGRFMWbsbzm/CkUtPLRL30I8T74Xgt/OQxnYokiA==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + '@nestjs/core': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + reflect-metadata: ^0.1.13 || ^0.2.0 + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@2.2.2': + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/arborist@7.5.4': + resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@5.0.8': + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/installed-package-contents@2.1.0': + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/metavuln-calculator@7.1.1': + resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/node-gyp@3.0.0': + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@5.2.1': + resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/promise-spawn@7.0.2': + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/query@3.1.0': + resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/redact@2.0.1': + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/run-script@8.1.0': + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@nuxt/cli@3.29.3': + resolution: {integrity: sha512-48GYmH4SyzR5pqd02UXVzBfrvEGaurPKMjSWxlHgqnpI5buwOYCvH+OqvHOmvnLrDP2bxR9hbDod/UIphOjMhg==} + engines: {node: ^16.10.0 || >=18.0.0} + hasBin: true + + '@nuxt/devalue@2.0.2': + resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} + + '@nuxt/devtools-kit@2.6.5': + resolution: {integrity: sha512-t+NxoENyzJ8KZDrnbVYv3FJI5VXqSi6X4w6ZsuIIh0aKABu6+6k9nR/LoEhrM0oekn/2LDhA0NmsRZyzCXt2xQ==} + peerDependencies: + vite: '>=6.0' + + '@nuxt/devtools-wizard@2.6.5': + resolution: {integrity: sha512-nYYGxT4lmQDvfHL6qolNWLu0QTavsdN/98F57falPuvdgs5ev1NuYsC12hXun+5ENcnigEcoM9Ij92qopBgqmQ==} + hasBin: true + + '@nuxt/devtools@2.6.5': + resolution: {integrity: sha512-Xh9XF1SzCTL5Zj6EULqsN2UjiNj4zWuUpS69rGAy5C55UTaj+Wn46IkDc6Q0+EKkGI279zlG6SzPRFawqPPUEw==} + hasBin: true + peerDependencies: + vite: '>=6.0' + + '@nuxt/eslint-config@1.9.0': + resolution: {integrity: sha512-KLiYlX/MmWR9dhC0u7GSZQl6wyVLGAHme5aAL5fAUT1PLYgcFiJIUg1Z+b296LmwHGTa+oGPRBIk3yoDmX9/9Q==} + peerDependencies: + eslint: ^9.0.0 + eslint-plugin-format: '*' + peerDependenciesMeta: + eslint-plugin-format: + optional: true + + '@nuxt/eslint-plugin@1.9.0': + resolution: {integrity: sha512-DY4ZSavgFyKQxI/NCOpSCUHg3dpS2O4lAdic5UmvP2NWj1xwtvmA9UwEZQ2nW2/f/Km6N+Q53UsgFSIBjz8jDQ==} + peerDependencies: + eslint: ^9.0.0 + + '@nuxt/kit@3.19.3': + resolution: {integrity: sha512-ze46EW5xW+UxDvinvPkYt2MzR355Az1lA3bpX8KDialgnCwr+IbkBij/udbUEC6ZFbidPkfK1eKl4ESN7gMY+w==} + engines: {node: '>=18.12.0'} + + '@nuxt/kit@4.1.2': + resolution: {integrity: sha512-P5q41xeEOa6ZQC0PvIP7TSBmOAMxXK4qihDcCbYIJq8RcVsEPbGZVlidmxE6EOw1ucSyodq9nbV31FAKwoL4NQ==} + engines: {node: '>=18.12.0'} + + '@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 + + '@nuxt/schema@4.1.2': + resolution: {integrity: sha512-uFr13C6c52OFbF3hZVIV65KvhQRyrwp1GlAm7EVNGjebY8279QEel57T4R9UA1dn2Et6CBynBFhWoFwwo97Pig==} + engines: {node: ^14.18.0 || >=16.10.0} + + '@nuxt/telemetry@2.6.6': + resolution: {integrity: sha512-Zh4HJLjzvm3Cq9w6sfzIFyH9ozK5ePYVfCUzzUQNiZojFsI2k1QkSBrVI9BGc6ArKXj/O6rkI6w7qQ+ouL8Cag==} + engines: {node: '>=18.12.0'} + hasBin: true + + '@nuxt/vite-builder@4.1.2': + resolution: {integrity: sha512-to9NKVtzMBtyuhIIVgwo/ph5UCONcxkVsoAjm8HnSkDi0o9nDPhHOAg1AUMlvPnHpdXOzwnSrXo/t8E7W+UZ/A==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vue: ^3.3.4 + '@nuxtjs/google-fonts@3.2.0': resolution: {integrity: sha512-cGAjDJoeQ2jm6VJCo4AtSmKO6KjsbO9RSLj8q261fD0lMVNMZCxkCxBkg8L0/2Vfgp+5QBHWVXL71p1tiybJFw==} - '@one-ini/wasm@0.1.1': - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@opentelemetry/api-logs@0.204.0': + resolution: {integrity: sha512-DqxY8yoAaiBPivoJD4UtgrMS8gEmzZ5lnaxzPojzLVHBGqPxgWm4zcuvcUHZiqQ6kRX2Klel2r9y8cA2HAtqpw==} + engines: {node: '>=8.0.0'} - '@opentelemetry/api-logs@0.52.1': - resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} + '@opentelemetry/api-logs@0.55.0': + resolution: {integrity: sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==} + engines: {node: '>=14'} + + '@opentelemetry/api-logs@0.57.2': + resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} engines: {node: '>=14'} '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@1.25.1': - resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==} + '@opentelemetry/context-async-hooks@1.30.1': + resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@1.25.1': - resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} + '@opentelemetry/context-async-hooks@2.1.0': + resolution: {integrity: sha512-zOyetmZppnwTyPrt4S7jMfXiSX9yyfF0hxlA8B5oo2TtKl+/RGCy7fi4DrBfIf3lCPrkKsRBWZZD7RFojK7FDg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-zipkin@1.25.1': - resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==} + '@opentelemetry/core@2.1.0': + resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-zipkin@1.30.1': + resolution: {integrity: sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.0.0 - '@opentelemetry/instrumentation-grpc@0.52.1': - resolution: {integrity: sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==} + '@opentelemetry/instrumentation-amqplib@0.51.0': + resolution: {integrity: sha512-XGmjYwjVRktD4agFnWBWQXo9SiYHKBxR6Ag3MLXwtLE4R99N3a08kGKM5SC1qOFKIELcQDGFEFT9ydXMH00Luw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.48.0': + resolution: {integrity: sha512-OMjc3SFL4pC16PeK+tDhwP7MRvDPalYCGSvGqUhX5rASkI2H0RuxZHOWElYeXkV0WP+70Gw6JHWac/2Zqwmhdw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dataloader@0.22.0': + resolution: {integrity: sha512-bXnTcwtngQsI1CvodFkTemrrRSQjAjZxqHVc+CJZTDnidT0T6wt3jkKhnsjU/Kkkc0lacr6VdRpCu2CUWa0OKw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.53.0': + resolution: {integrity: sha512-r/PBafQmFYRjuxLYEHJ3ze1iBnP2GDA1nXOSS6E02KnYNZAVjj6WcDA1MSthtdAUUK0XnotHvvWM8/qz7DMO5A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.24.0': + resolution: {integrity: sha512-HjIxJ6CBRD770KNVaTdMXIv29Sjz4C1kPCCK5x1Ujpc6SNnLGPqUVyJYZ3LUhhnHAqdbrl83ogVWjCgeT4Q0yw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.48.0': + resolution: {integrity: sha512-TLv/On8pufynNR+pUbpkyvuESVASZZKMlqCm4bBImTpXKTpqXaJJ3o/MUDeMlM91rpen+PEv2SeyOKcHCSlgag==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.52.0': + resolution: {integrity: sha512-3fEJ8jOOMwopvldY16KuzHbRhPk8wSsOTSF0v2psmOCGewh6ad+ZbkTx/xyUK9rUdUMWAxRVU0tFpj4Wx1vkPA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-grpc@0.55.0': + resolution: {integrity: sha512-n2ZH4pRwOy0Vhag/3eKqiyDBwcpUnGgJI9iiIRX7vivE0FMncaLazWphNFezRRaM/LuKwq1TD8pVUvieP68mow==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.52.1': - resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} + '@opentelemetry/instrumentation-hapi@0.51.0': + resolution: {integrity: sha512-qyf27DaFNL1Qhbo/da+04MSCw982B02FhuOS5/UF+PMhM61CcOiu7fPuXj8TvbqyReQuJFljXE6UirlvoT/62g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.204.0': + resolution: {integrity: sha512-1afJYyGRA4OmHTv0FfNTrTAzoEjPQUYgd+8ih/lX0LlZBnGio/O80vxA0lN3knsJPS7FiDrsDrWq25K7oAzbkw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.52.0': + resolution: {integrity: sha512-rUvlyZwI90HRQPYicxpDGhT8setMrlHKokCtBtZgYxQWRF5RBbG4q0pGtbZvd7kyseuHbFpA3I/5z7M8b/5ywg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.14.0': + resolution: {integrity: sha512-kbB5yXS47dTIdO/lfbbXlzhvHFturbux4EpP0+6H78Lk0Bn4QXiZQW7rmZY1xBCY16mNcCb8Yt0mhz85hTnSVA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.49.0': + resolution: {integrity: sha512-NKsRRT27fbIYL4Ix+BjjP8h4YveyKc+2gD6DMZbr5R5rUeDqfC8+DTfIt3c3ex3BIc5Vvek4rqHnN7q34ZetLQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.52.0': + resolution: {integrity: sha512-JJSBYLDx/mNSy8Ibi/uQixu2rH0bZODJa8/cz04hEhRaiZQoeJ5UrOhO/mS87IdgVsHrnBOsZ6vDu09znupyuA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.49.0': + resolution: {integrity: sha512-ctXu+O/1HSadAxtjoEg2w307Z5iPyLOMM8IRNwjaKrIpNAthYGSOanChbk1kqY6zU5CrpkPHGdAT6jk8dXiMqw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.57.0': + resolution: {integrity: sha512-KD6Rg0KSHWDkik+qjIOWoksi1xqSpix8TSPfquIK1DTmd9OTFb5PHmMkzJe16TAPVEuElUW8gvgP59cacFcrMQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.51.0': + resolution: {integrity: sha512-gwWaAlhhV2By7XcbyU3DOLMvzsgeaymwP/jktDC+/uPkCmgB61zurwqOQdeiRq9KAf22Y2dtE5ZLXxytJRbEVA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.51.0': + resolution: {integrity: sha512-zT2Wg22Xn43RyfU3NOUmnFtb5zlDI0fKcijCj9AcK9zuLZ4ModgtLXOyBJSSfO+hsOCZSC1v/Fxwj+nZJFdzLQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.50.0': + resolution: {integrity: sha512-duKAvMRI3vq6u9JwzIipY9zHfikN20bX05sL7GjDeLKr2qV0LQ4ADtKST7KStdGcQ+MTN5wghWbbVdLgNcB3rA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.50.0': + resolution: {integrity: sha512-10u2Gjw260W8vdUem6pM7ENrb8i+UAyrgouhjN7HRdQYh9rcit51tRhgrI52fxTsRjrrBNIItHkX0YM8WnEU2w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.57.0': + resolution: {integrity: sha512-dWLGE+r5lBgm2A8SaaSYDE3OKJ/kwwy5WLyGyzor8PLhUL9VnJRiY6qhp4njwhnljiLtzeffRtG2Mf/YyWLeTw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.53.0': + resolution: {integrity: sha512-WUHV8fr+8yo5RmzyU7D5BIE1zwiaNQcTyZPwtxlfr7px6NYYx7IIpSihJK7WA60npWynfxxK1T67RAVF0Gdfjg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.23.0': + resolution: {integrity: sha512-3TMTk/9VtlRonVTaU4tCzbg4YqW+Iq/l5VnN2e5whP6JgEg/PKfrGbqQ+CxQWNLfLaQYIUgEZqAn5gk/inh1uQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.15.0': + resolution: {integrity: sha512-sNFGA/iCDlVkNjzTzPRcudmI11vT/WAfAguRdZY9IspCw02N4WSC72zTuQhSMheh2a1gdeM9my1imnKRvEEvEg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation@0.204.0': + resolution: {integrity: sha512-vV5+WSxktzoMP8JoYWKeopChy6G3HKk4UQ2hESCRDUUTZqQ3+nM3u8noVG0LmNfRWwcFBnbZ71GKC7vaYYdJ1g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.55.0': + resolution: {integrity: sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.57.2': + resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/propagator-b3@1.25.1': - resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==} + '@opentelemetry/propagator-b3@1.30.1': + resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/propagator-jaeger@1.25.1': - resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==} + '@opentelemetry/propagator-jaeger@1.30.1': + resolution: {integrity: sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.25.1': - resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} + '@opentelemetry/redis-common@0.38.2': + resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.25.1': - resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} + '@opentelemetry/resources@2.1.0': + resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.25.1': - resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==} + '@opentelemetry/sdk-trace-base@2.1.0': + resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.30.1': + resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.25.1': - resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.26.0': - resolution: {integrity: sha512-U9PJlOswJPSgQVPI+XEuNLElyFWkb0hAiMg+DExD9V0St03X2lPHGMdxMY/LrVmoukuIpXJ12oyrOtEZ4uXFkw==} + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@oxc-minify/binding-android-arm64@0.87.0': + resolution: {integrity: sha512-ZbJmAfXvNAamOSnXId3BiM3DiuzlD1isqKjtmRFb/hpvChHHA23FSPrFcO16w+ugZKg33sZ93FinFkKtlC4hww==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-minify/binding-darwin-arm64@0.87.0': + resolution: {integrity: sha512-ewmNsTY8YbjWOI8+EOWKTVATOYvG4Qq4zQHH5VFBeqhQPVusY1ORD6Ei+BijVKrnlbpjibLlkTl8IWqXCGK89A==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-minify/binding-darwin-x64@0.87.0': + resolution: {integrity: sha512-qDH4w4EYttSC3Cs2VCh+CiMYKrcL2SNmnguBZXoUXe/RNk3csM+RhgcwdpX687xGvOhTFhH5PCIA84qh3ZpIbQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-minify/binding-freebsd-x64@0.87.0': + resolution: {integrity: sha512-5kxjHlSev2A09rDeITk+LMHxSrU3Iu8pUb0Zp4m+ul8FKlB9FrvFkAYwbctin6g47O98s3Win7Ewhy0w8JaiUA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-minify/binding-linux-arm-gnueabihf@0.87.0': + resolution: {integrity: sha512-NjbGXnNaAl5EgyonaDg2cPyH2pTf5a/+AP/5SRCJ0KetpXV22ZSUCvcy04Yt4QqjMcDs+WnJaGVxwx15Ofr6Gw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm-musleabihf@0.87.0': + resolution: {integrity: sha512-llAjfCA0iV2LMMl+LTR3JhqAc2iQmj+DTKd0VWOrbNOuNczeE9D5kJFkqYplD73LrkuqxrX9oDeUjjeLdVBPXw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm64-gnu@0.87.0': + resolution: {integrity: sha512-tf2Shom09AaSmu7U1hYYcEFF/cd+20HtmQ8eyGsRkqD5bqUj6lDu8TNSU9FWZ9tcZ83NzyFMwXZWHyeeIIbpxw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-minify/binding-linux-arm64-musl@0.87.0': + resolution: {integrity: sha512-pgWeYfSprtpnJVea9Q5eI6Eo80lDGlMw2JdcSMXmShtBjEhBl6bvDNHlV+6kNfh7iT65y/uC6FR8utFrRghu8A==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-minify/binding-linux-riscv64-gnu@0.87.0': + resolution: {integrity: sha512-O1QPczlT+lqNZVeKOdFxxL+s1RIlnixaJYFLrcqDcRyn82MGKLz7sAenBTFRQoIfLnSxtMGL6dqHOefYkQx7Cg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-minify/binding-linux-s390x-gnu@0.87.0': + resolution: {integrity: sha512-tcwt3ZUWOKfNLXN2edxFVHMlIuPvbuyMaKmRopgljSCfFcNHWhfTNlxlvmECRNhuQ91EcGwte6F1dwoeMCNd7A==} + engines: {node: '>=14.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-minify/binding-linux-x64-gnu@0.87.0': + resolution: {integrity: sha512-Xf4AXF14KXUzSnfgTcFLFSM0TykJhFw14+xwNvlAb6WdqXAKlMrz9joIAezc8dkW1NNscCVTsqBUPJ4RhvCM1Q==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-minify/binding-linux-x64-musl@0.87.0': + resolution: {integrity: sha512-LIqvpx9UihEW4n9QbEljDnfUdAWqhr6dRqmzSFwVAeLZRUECluLCDdsdwemrC/aZkvnisA4w0LFcFr3HmeTLJg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-minify/binding-wasm32-wasi@0.87.0': + resolution: {integrity: sha512-h0xluvc+YryfH5G5dndjGHuA/D4Kp85EkPMxqoOjNudOKDCtdobEaC9horhCqnOOQ0lgn+PGFl3w8u4ToOuRrA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-minify/binding-win32-arm64-msvc@0.87.0': + resolution: {integrity: sha512-fgxSx+TUc7e2rNtRAMnhHrjqh1e8p/JKmWxRZXtkILveMr/TOHGiDis7U3JJbwycmTZ+HSsJ/PNFQl+tKzmDxw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-minify/binding-win32-x64-msvc@0.87.0': + resolution: {integrity: sha512-K6TTrlitEJgD0FGIW2r0t3CIJNqBkzHT97h49gZLS24ey2UG1zKt27iSHkpXMJYDiG97ZD2yv3pSph1ctMlFXw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-parser/binding-android-arm64@0.87.0': + resolution: {integrity: sha512-3APxTyYaAjpW5zifjzfsPgoIa4YHwA5GBjtgLRQpGVXCykXBIEbUTokoAs411ZuOwS3sdTVXBTGAdziXRd8rUg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.87.0': + resolution: {integrity: sha512-99e8E76M+k3Gtwvs5EU3VTs2hQkJmvnrl/eu7HkBUc9jLFHA4nVjYSgukMuqahWe270udUYEPRfcWKmoE1Nukg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.87.0': + resolution: {integrity: sha512-2rRo6Dz560/4ot5Q0KPUTEunEObkP8mDC9mMiH0RJk1FiOb9c+xpPbkYoUHNKuVMm8uIoiBCxIAbPtBhs9QaXQ==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.87.0': + resolution: {integrity: sha512-uR+WZAvWkFQPVoeqXgQFr7iy+3hEI295qTbQ4ujmklgM5eTX3YgMFoIV00Stloxfd1irSDDSaK7ySnnzF6mRJg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.87.0': + resolution: {integrity: sha512-Emm1NpVGKbwzQOIZJI8ZuZu0z8FAd5xscqdS6qpDFpDdEMxk6ab7o3nM8V09RhNCORAzeUlk4TBHQ2Crzjd50A==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.87.0': + resolution: {integrity: sha512-1PPCxRZSJXzQaqc8y+wH7EqPgSfQ/JU3pK6WTN/1SUe/8paNVSKKqk175a8BbRVxGUtPnwEG89pi+xfPTSE7GA==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.87.0': + resolution: {integrity: sha512-fcnnsfcyLamJOMVKq+BQ8dasb8gRnZtNpCUfZhaEFAdXQ7J2RmZreFzlygcn80iti0V7c5LejcjHbF4IdK3GAw==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.87.0': + resolution: {integrity: sha512-tBPkSPgRSSbmrje8CUovISi/Hj/tWjZJ3n/qnrjx2B+u86hWtwLsngtPDQa5d4seSyDaHSx6tNEUcH7+g5Ee0Q==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.87.0': + resolution: {integrity: sha512-z4UKGM4wv2wEAQAlx2pBq6+pDJw5J/5oDEXqW6yBSLbWLjLDo4oagmRSE3+giOWteUa+0FVJ+ypq4iYxBkYSWg==} + engines: {node: '>=20.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.87.0': + resolution: {integrity: sha512-6W1ENe/nZtr2TBnrEzmdGEraEAdZOiH3YoUNNeQWuqwLkmpoHTJJdclieToPe/l2IKJ4WL3FsSLSGHE8yt/OEg==} + engines: {node: '>=20.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.87.0': + resolution: {integrity: sha512-s3kB/Ii3X3IOZ27Iu7wx2zYkIcDO22Emu32SNC6kkUSy09dPBc1yaW14TnAkPMe/rvtuzR512JPWj3iGpl+Dng==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.87.0': + resolution: {integrity: sha512-3+M9hfrZSDi4+Uy4Ll3rtOuVG3IHDQlj027jgtmAAHJK1eqp4CQfC7rrwE+LFUqUwX+KD2GwlxR+eHyyEf5Gbg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-wasm32-wasi@0.87.0': + resolution: {integrity: sha512-2jgeEeOa4GbQQg2Et/gFTgs5wKS/+CxIg+CN2mMOJ4EqbmvUVeGiumO01oFOWTYnJy1oONwIocBzrnMuvOcItA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.87.0': + resolution: {integrity: sha512-KZp9poaBaVvuFM0TrsHCDOjPQK5eMDXblz21boMhKHGW5/bOlkMlg3CYn5j0f67FkK68NSdNKREMxmibBeXllQ==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.87.0': + resolution: {integrity: sha512-86uisngtp/8XdcerIKxMyJTqgDSTJatkfpylpUH0d96W8Bb9E+bVvM2fIIhLWB0Eb03PeY2BdIT7DNIln9TnHg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.87.0': + resolution: {integrity: sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g==} + + '@oxc-transform/binding-android-arm64@0.87.0': + resolution: {integrity: sha512-B7W6J8T9cS054LUGLfYkYz8bz5+t+4yPftZ67Bn6MJ03okMLnbbEfm1bID1tqcP5tJwMurTILVy/dQfDYDcMgQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-transform/binding-darwin-arm64@0.87.0': + resolution: {integrity: sha512-HImW3xOPx7FHKqfC5WfE82onhRfnWQUiB7R+JgYrk+7NR404h3zANSPzu3V/W9lbDxlmHTcqoD2LKbNC5j0TQA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-transform/binding-darwin-x64@0.87.0': + resolution: {integrity: sha512-MDbgugi6mvuPTfS78E2jyozm7493Kuqmpc5r406CsUdEsXlnsF+xvmKlrW9ZIkisO74dD+HWouSiDtNyPQHjlw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-transform/binding-freebsd-x64@0.87.0': + resolution: {integrity: sha512-N0M5D/4haJw7BMn2WZ3CWz0WkdLyoK1+3KxOyCv2CPedMCxx6eQay2AtJxSzj9tjVU1+ukbSb2fDO24JIJGsVA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-transform/binding-linux-arm-gnueabihf@0.87.0': + resolution: {integrity: sha512-PubObCNOUOzm1S+P0yn7S+/6xRLbSPMqhgrb73L3p+J1Z20fv/FYVg0kFd36Yho24TSC/byOkebEZWAtxCasWw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm-musleabihf@0.87.0': + resolution: {integrity: sha512-Nk2d/FS7sMCmCl99vHojzigakjDPamkjOXs2i+H71o/NqytS0pk3M+tXat8M3IGpeLJIEszA5Mv+dcq731nlYA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.87.0': + resolution: {integrity: sha512-BxFkIcso2V1+FCDoU+KctxvJzSQVSnEZ5EEQ8O3Up9EoFVQRnZ8ktXvqYj2Oqvc4IYPskLPsKUgc9gdK8wGhUg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-arm64-musl@0.87.0': + resolution: {integrity: sha512-MZ1/TNaebhXK73j1UDfwyBFnAy0tT3n6otOkhlt1vlJwqboUS/D7E/XrCZmAuHIfVPxAXRPovkl7kfxLB43SKw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-gnu@0.87.0': + resolution: {integrity: sha512-JCWE6n4Hicu0FVbvmLdH/dS8V6JykOUsbrbDYm6JwFlHr4eFTTlS2B+mh5KPOxcdeOlv/D/XRnvMJ6WGYs25EA==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-s390x-gnu@0.87.0': + resolution: {integrity: sha512-n2NTgM+3PqFagJV9UXRDNOmYesF+TO9SF9FeHqwVmW893ayef9KK+vfWAAhvOYHXYaKWT5XoHd87ODD7nruyhw==} + engines: {node: '>=14.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-transform/binding-linux-x64-gnu@0.87.0': + resolution: {integrity: sha512-ZOKW3wx0bW2O7jGdOzr8DyLZqX2C36sXvJdsHj3IueZZ//d/NjLZqEiUKz+q0JlERHtCVKShQ5PLaCx7NpuqNg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-linux-x64-musl@0.87.0': + resolution: {integrity: sha512-eIspx/JqkVMPK1CAYEOo2J8o49s4ZTf+32MSMUknIN2ZS1fvRmWS0D/xFFaLP/9UGhdrXRIPbn/iSYEA8JnV/g==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-wasm32-wasi@0.87.0': + resolution: {integrity: sha512-4uRjJQnt/+kmJUIC6Iwzn+MqqZhLP1zInPtDwgL37KI4VuUewUQWoL+sggMssMEgm7ZJwOPoZ6piuSWwMgOqgQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.87.0': + resolution: {integrity: sha512-l/qSi4/N5W1yXKU9+1gWGo0tBoRpp4zvHYrpsbq3zbefPL4VYdA0gKF7O10/ZQVkYylzxiVh2zpYO34/FbZdIg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.87.0': + resolution: {integrity: sha512-jG/MhMjfSdyj5KyhnwNWr4mnAlAsz+gNUYpjQ+UXWsfsoB3f8HqbsTkG02RBtNa/IuVQYvYYVf1eIimNN3gBEQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-wasm@2.4.1': - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} + '@parcel/watcher-wasm@2.5.1': + resolution: {integrity: sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==} engines: {node: '>= 10.0.0'} bundledDependencies: - napi-wasm - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@percy/cli-app@1.30.1': - resolution: {integrity: sha512-/ZLGjAFeQKHeaQI5xQ9w6lLljEKWXB/+QuIHl3kGK+NL1+cZtRBk6oDbWj+QRKxg/tr+3zvwjioNIdkDaXgXUQ==} + '@percy/cli-app@1.31.3': + resolution: {integrity: sha512-g9NnYQgVVugGQZhUnpd4bJY9zfZnSOM4jJVPrdA2cOO+JxKJr7079JCkcNdrOqmtSbZ01XugSKz5UgQN+SUgMg==} engines: {node: '>=14'} - '@percy/cli-build@1.30.1': - resolution: {integrity: sha512-jr9URjHjYKBchUy7I0eh2agGzpN5Ct+A/Q+jlUbkR5N7AyXW3FbkbA6ZiPYXuG+i2Sjm1wuxMGPKMSIKTVZ3GQ==} + '@percy/cli-build@1.31.3': + resolution: {integrity: sha512-VNybZILAj9GoEf2lB/DueO+KibEhgV2Gbh1kCUsUwmINOrZy2vD6Izy+asCPgdLWY5xe09K2QuLPOfgq5JfZWw==} engines: {node: '>=14'} - '@percy/cli-command@1.30.1': - resolution: {integrity: sha512-a8qoZu4IaPp6cKse5ovruI6oeuXJQR2D2aJGwDpnaBbryX4ArSX+x0LoI59SfdEisUxf5JPjiSPmixTmWUxqxA==} + '@percy/cli-command@1.31.3': + resolution: {integrity: sha512-NLF4HoLkz3vlgIIfgweQgwFowyOG5PYD67DCzzwK34picoeOa6u1zlx1mhaZA9L1kDwJcfTSNSbht7CpBiL6JQ==} engines: {node: '>=14'} hasBin: true - '@percy/cli-config@1.30.1': - resolution: {integrity: sha512-Rgefm7jyYNdh86eEWj+TKeXhKC1+thlSzFQEraTaanhacBaVHDwEtd5x1hmRMQZPiI759cwVh+dFus3n8DwsaQ==} + '@percy/cli-config@1.31.3': + resolution: {integrity: sha512-hELWI27R9RyRGC59f30+Ob9Zy07OuGPqrm9SccGsybpj31qZkV0WK8H3vTWkLzPBPoHMnXbshPFYr5VkEsUBTA==} engines: {node: '>=14'} - '@percy/cli-exec@1.30.1': - resolution: {integrity: sha512-XsXzfXUIrpKo/3CmgffgVurLlVFlThCO+Kc5IV83ggJhdFAVoJc9cSLOgZyrTBsKEprHmWi5Wn4RLMXhxlaGVg==} + '@percy/cli-exec@1.31.3': + resolution: {integrity: sha512-TZiCFoDyNmsw8ZB3dmz2ciVVoApHYkaK4plCBBRY1BI7d6jRBJifct0rNvklnTjHYsCsTGVGthnenAih33kFaA==} engines: {node: '>=14'} - '@percy/cli-snapshot@1.30.1': - resolution: {integrity: sha512-86ahSoh3PgbM8ZAL38PVz4X6NMTKsyHTfnGf8T0KH9/MLLp2uokJPJTIpXkPq4OeqzNEq2eOHzaRuXf5wOeHtw==} + '@percy/cli-snapshot@1.31.3': + resolution: {integrity: sha512-amurMrPpj3AmoHopdr3utA/iv0Oj6d+BPqbRLvh7OhutPMPOc0zrDKVDKiocfRKTkGVxkBgnt8NTl+rvx450Vg==} engines: {node: '>=14'} - '@percy/cli-upload@1.30.1': - resolution: {integrity: sha512-wRR4yLI5tKGXz5Y6ZaufLRo2yKVGZVA4zZsYLTbQgmgPxnAYCc5/eu1C2cxfvgeCxNZqwmS6giqxMzfa5z9nKg==} + '@percy/cli-upload@1.31.3': + resolution: {integrity: sha512-rP+iDQBFguuG2wWN+OwbclM+3Vj01dkxNUcBBEeQ16pZQ0zSbOq5Qt/2Mw93SMoNpa0il4vk4zmcXPgApA+Qgg==} engines: {node: '>=14'} - '@percy/cli@1.30.1': - resolution: {integrity: sha512-9mLD6q5nT106+Qxkkw28GVxcL2vgqG9mO6Tp55MeEjySSh+EBpadsCUh93oDN64ZcRUObAE56B+sy4H8PkBLGQ==} + '@percy/cli@1.31.3': + resolution: {integrity: sha512-BhxNjwTWuN1xxin1bc1qGCqe2suusFUDKYot7e90UGRa6wUSZsyjmzC9kGfb3IhEmpM0EswQSePp7RR2d6saww==} engines: {node: '>=14'} hasBin: true - '@percy/client@1.30.1': - resolution: {integrity: sha512-vaue3/dOykOWZ9ER/vecb9mkcuTe72wgCrYbzIcKNtSUc5AQEGiV5c8rGZav868i5YCtGejexWZ7PKDO05asag==} + '@percy/client@1.31.3': + resolution: {integrity: sha512-XzXHNco39qqzclL8y7t/k/VTR+9nhXkyfCqvbxFUS9DDG+Jd2Tv6dpRc5qv7phhp2VoKBdVVu46gMBG+qSl7yg==} engines: {node: '>=14'} - '@percy/config@1.30.1': - resolution: {integrity: sha512-wvI2QIf7/oLPsnrXGHFCLRdDY5BRFE3Smil8IY2ijtGUFWXRPsmRx2tjSdbZ/kpctkeyZappNHPzSiwi1MjJlA==} + '@percy/config@1.31.3': + resolution: {integrity: sha512-yTl+MUGNxMv+xQbMXR3g/tISRohE39b+s7216Z3ILtqJejIzxB0jbBfkvGqLAmlBbC63hTjg6s2JECoH7x131w==} engines: {node: '>=14'} - '@percy/core@1.30.1': - resolution: {integrity: sha512-XQNPFO8ZmKWMMkWaa+IWN6Kzh7CXCwosLWK7OsEldK7N/CVNGmU8mkCwpqYlDXEeiahGfUxqCr4yHZS26OveyQ==} + '@percy/core@1.31.3': + resolution: {integrity: sha512-RuYNMDpnybYpE8bcB9ymmBH67gZkL04gtqt5MljYwOvhdtBhG6B/Tn0j7j9wSwA+ob70jzJ+/YHDQkMVOQA+TA==} engines: {node: '>=14'} - '@percy/dom@1.30.1': - resolution: {integrity: sha512-dYHVGETIXzwqchShfzOkCrGCqjw/KLsubUZR3PYWd6UtTWZ9kFWr9I6MzizPE4XfhJs5rQ0e0Keb29FrGTey5Q==} + '@percy/dom@1.31.3': + resolution: {integrity: sha512-Sj52zexDmEvDlASrPyf0HFQ8qQOw/X8GjAgdvfCMOiwqxRfEwYGxOYO0L7x69+BVNqaZj4rlvaNdJJ9RekQLnA==} + + '@percy/env@1.31.3': + resolution: {integrity: sha512-luUfJq4gN1PgbvQQGx+cytqxmp/pOThCze/cts2PZx1vxGyRjOzBmMQYlrx99rnKeJ3vw6DVdnAyk1y55nVz6g==} + engines: {node: '>=14'} - '@percy/env@1.30.1': - resolution: {integrity: sha512-ib9Ty/zo/+kfQSRC7RyzxnrS5zzsaoWJLgvTUDwi4iv/UIvx6vrEp7YPE0FQu1VGoRoL7zxRKalTh06/kBAsXg==} + '@percy/logger@1.31.3': + resolution: {integrity: sha512-msfmqpthOblDfsnLzRKTeJeV/qHYMZ1dPDP2mZJmN7BmgADw81imPylrbzCWmvv4ljoQ7vYu4QuAM9qHV3dzFw==} engines: {node: '>=14'} - '@percy/logger@1.30.1': - resolution: {integrity: sha512-FaVW4YGmgPaW0OviMFUn7m7ski2uZQAeUJ/hg+IXFIN+zSreX2ORcsp+Fep2p+h5UjcZX5wFuf/8O3nth5YAfQ==} + '@percy/monitoring@1.31.3': + resolution: {integrity: sha512-+QERs2QMkG27nh2a9feQ1+WEUxS7m2qqt0FzO0TReUbQLH1hNa4qREWhLqeYAzbYI+FKZjtcE6ghVSu8+PZDYA==} engines: {node: '>=14'} - '@percy/playwright@1.0.6': - resolution: {integrity: sha512-oi98dnsTp/QG0NUFTUHsyqoWvgDOuzBmSzCwZCjxu52k7F8hzaOazqRqqdRHc7GVRUL561RUdkzZi0xhiW+Jfg==} + '@percy/playwright@1.0.9': + resolution: {integrity: sha512-t74a0hZcAR+ssNpbcL6vnYU5mwEGcdRByLYFb12yFQUq4n250YUAX76jI4OHzH440Tikp84hml4JnbXrvgEmFQ==} engines: {node: '>=14'} peerDependencies: playwright-core: '>=1' - '@percy/sdk-utils@1.30.1': - resolution: {integrity: sha512-xdeaHEdQvytFEbNBYCFdu1ToD6T/BT6YtZYwfNKAYXwQqVbm4wr/3LVH+GUcxYZsBCxmeSyCrF4buspUhxTNJQ==} + '@percy/sdk-utils@1.31.3': + resolution: {integrity: sha512-iEnhc+x5lVmH6va5FuljAWfSFcjjqcPJ+GgoFvuvvYv39nMgXgsw4qGT+sr2ET+FpBB4f0MNs/Bn7QEkk1TlvA==} engines: {node: '>=14'} - '@percy/webdriver-utils@1.30.1': - resolution: {integrity: sha512-mXY40mUBLsdwFMKsZpg87K457a76Qi0Dq8+nZ0rLqYj5STZs3RQWbgi9qMI3ELoB3BqLzePqR9pL8J9WjvRXDg==} + '@percy/webdriver-utils@1.31.3': + resolution: {integrity: sha512-+MzTmpcmuLCX9jYmtJxNV9yE8748DSk0NZfu56Jp4HuOf/LBRnh/ShpHHo4tuEg3qaM3yqNP7KvR99/HpECQRg==} engines: {node: '>=14'} - '@pinia/nuxt@0.5.5': - resolution: {integrity: sha512-wjxS7YqIesh4OLK+qE3ZjhdOJ5pYZQ+VlEmZNtTwzQn1Kavei/khovx7mzXVXNA/mvSPXVhb9xBzhyS3XMURtw==} + '@pinia/nuxt@0.11.2': + resolution: {integrity: sha512-CgvSWpbktxxWBV7ModhAcsExsQZqpPq6vMYEe9DexmmY6959ev8ukL4iFhr/qov2Nb9cQAWd7niFDnaWkN+FHg==} + peerDependencies: + pinia: ^3.0.3 '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.46.1': - resolution: {integrity: sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==} + '@playwright/test@1.56.0': + resolution: {integrity: sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==} engines: {node: '>=18'} hasBin: true - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + + '@prisma/instrumentation@6.15.0': + resolution: {integrity: sha512-6TXaH6OmDkMOQvOxwLZ8XS51hU2v4A3vmE2pSijCIiGRJYyNeMcL6nMHQMyYdZRD8wl7LF3Wzc+AMPMV/9Oo7A==} + peerDependencies: + '@opentelemetry/api': ^1.8 + '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -2260,27 +3079,30 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@pulumi/aws@5.43.0': - resolution: {integrity: sha512-ZWI+QvEaFy27wUW8j8EVadgvl6u3926AAgpghflSPxF/9mG5XoDy0rqkRZOgO13ZJinC1qkQDzoMz0ACgmwTiw==} + '@pulumi/aws@6.83.0': + resolution: {integrity: sha512-uYpYSA5aaDERFuxy3D+FDWiwH7YYNHSwGLpHVuARAzBfQ/SQDkS/tfJI5NNo7/+KCmje3rloKE2enUK/Q9bVBg==} - '@pulumi/aws@6.58.0': - resolution: {integrity: sha512-nP8kdpcHsu/RO8P9LGCaJ06KnGKt6fpvNZE7IUfkHdZ9ErYu4kCx+eX/mo/QAexeOmOmdt3Oa7BLhACQRb3M8Q==} + '@pulumi/aws@7.8.0': + resolution: {integrity: sha512-OVdg0dZtzO5qZ/erX4aLZ/9U1AKw9LX+79N3RyZEMSkq5KVUOEBugYBw0xlxJV5kkRrxjzSgMb4LknX7v0tZRw==} - '@pulumi/awsx@1.0.6': - resolution: {integrity: sha512-zTBsRO6EeSg6V2sEkw1b8OtvExaYMg1rUlaJVfui54W86M3KvFANtGI99a+aScUxJMxGqkS9cb6LdzZjTlKQGA==} + '@pulumi/awsx@2.22.0': + resolution: {integrity: sha512-uajrWX6zkk8G9DCCkCkRaH2yzeGRkCElkC8FOE9viUtb9WyVt01EbNqJkje+QwYq4g055jWqcq2YRn7xT1Y44w==} - '@pulumi/awsx@2.17.0': - resolution: {integrity: sha512-uw2a9P9KVx2JWAiHNUN/xpeLoSr7GNKMZdzM3TePbV0+Gz44/BrwT43qPMHbiTcW+Yxz4S1L3sh46w/IyzIwIA==} + '@pulumi/awsx@3.0.0': + resolution: {integrity: sha512-Qce18z2zSSIpeQA+aUKNlDKAZaZIc7h5ioYgmLfmpliRFwzFGN7DbxJuZY+Ja3hbtjpe74UYBjI5VleFM+Ougw==} + + '@pulumi/docker-build@0.0.8': + resolution: {integrity: sha512-tS6UUgmDjQ+LVekMXGC/6ND7riY75h3oO9fLiVOrvNafCBumxK+Cjm6ZZ9tUChLYvw6H+rZRExZEhfC8F/SQgQ==} '@pulumi/docker@3.6.1': resolution: {integrity: sha512-BZME50QkT556v+LvmTXPT8ssB2xxNkp9+msB5xYFEnUnWcdGAx5yUysQw70RJCb+U0GbkJSbxtlgMJgOQf/now==} - '@pulumi/docker@4.5.5': - resolution: {integrity: sha512-+5u0A3H3PTkxGfVuvDafbdyyYT8xLzLJnKdKc2jFEpphwKlXF+lc4YhjsDLBp1cc/5JPfE4hujOxGAxwt/5BUQ==} + '@pulumi/docker@4.9.0': + resolution: {integrity: sha512-Iw5WQClre7j32oQmo3ObmHKAab0y/7Pf0hmQvcGCiBgb7X20uW3XMKV8OAFjk7/5tdyYHd1LK6s6H882IT0Bvw==} - '@pulumi/pulumi@3.138.0': - resolution: {integrity: sha512-LcQTYwVecIpoA9Dnbq31+3IuOT4QYsGmCbXO0+wJLFlXBxBEoeq4Rft16shxM01n3EXJnTo4w5/pLetoAz0pYg==} - engines: {node: '>=18'} + '@pulumi/pulumi@3.202.0': + resolution: {integrity: sha512-Vxpo6K4dpHb4ldxxp1IvG3lzIIthmd5dWguLySqbz7MmEksHPvbgSzk2I2v8SJKGjluozQASYpgW+1myUIZjGA==} + engines: {node: '>=20'} peerDependencies: ts-node: '>= 7.0.1 < 12' typescript: '>= 3.8.3 < 6' @@ -2290,25 +3112,18 @@ packages: typescript: optional: true - '@pulumi/query@0.3.0': - resolution: {integrity: sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==} - - '@pulumi/random@4.16.3': - resolution: {integrity: sha512-B1cB3RAxC/Ic6g7Rj6bJv+wJJOBR2xorWOTSSTxjr0f10KdoQxLc+vzMu11MMgOzThhL4n7n8ZSLADxc7Rzk/g==} - - '@redocly/ajv@8.11.2': - resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} - - '@redocly/config@0.16.0': - resolution: {integrity: sha512-t9jnODbUcuANRSl/K4L9nb12V+U5acIHnVSl26NWrtSdDZVtoqUXk2yGFPZzohYf62cCfEQUT8ouJ3bhPfpnJg==} - - '@redocly/openapi-core@1.25.11': - resolution: {integrity: sha512-bH+a8izQz4fnKROKoX3bEU8sQ9rjvEIZOqU6qTmxlhOJ0NsKa5e+LmU18SV0oFeg5YhWQhhEDihXkvKJ1wMMNQ==} - engines: {node: '>=14.19.0', npm: '>=7.0.0'} + '@pulumi/random@4.18.3': + resolution: {integrity: sha512-2OKJPNTZu0YyxOMvxnHiUzh3qGm5EowIffAx9dKNUQRQLHOqm3TM2HQ0jYMQUrydrRbXopaiRavFFPD0QKyJEg==} '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + '@rolldown/pluginutils@1.0.0-beta.29': + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -2318,8 +3133,8 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@28.0.1': - resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} + '@rollup/plugin-commonjs@28.0.6': + resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -2345,8 +3160,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.0': - resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==} + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -2354,39 +3169,8 @@ packages: rollup: optional: true - '@rollup/plugin-replace@5.0.7': - resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-replace@6.0.1': - resolution: {integrity: sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} - - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + '@rollup/plugin-replace@6.0.2': + resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2394,17 +3178,17 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.2': - resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + '@rollup/plugin-terser@0.4.4': + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: ^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - '@rollup/pluginutils@5.1.3': - resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2412,147 +3196,210 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.24.4': - resolution: {integrity: sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==} + '@rollup/rollup-android-arm-eabi@4.52.4': + resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.4': - resolution: {integrity: sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==} + '@rollup/rollup-android-arm64@4.52.4': + resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.4': - resolution: {integrity: sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==} + '@rollup/rollup-darwin-arm64@4.52.4': + resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.4': - resolution: {integrity: sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==} + '@rollup/rollup-darwin-x64@4.52.4': + resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.24.4': - resolution: {integrity: sha512-py5oNShCCjCyjWXCZNrRGRpjWsF0ic8f4ieBNra5buQz0O/U6mMXCpC1LvrHuhJsNPgRt36tSYMidGzZiJF6mw==} + '@rollup/rollup-freebsd-arm64@4.52.4': + resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.24.4': - resolution: {integrity: sha512-L7VVVW9FCnTTp4i7KrmHeDsDvjB4++KOBENYtNYAiYl96jeBThFfhP6HVxL74v4SiZEVDH/1ILscR5U9S4ms4g==} + '@rollup/rollup-freebsd-x64@4.52.4': + resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.24.4': - resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': + resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.4': - resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==} + '@rollup/rollup-linux-arm-musleabihf@4.52.4': + resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.4': - resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==} + '@rollup/rollup-linux-arm64-gnu@4.52.4': + resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.4': - resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==} + '@rollup/rollup-linux-arm64-musl@4.52.4': + resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.4': - resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==} + '@rollup/rollup-linux-loong64-gnu@4.52.4': + resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.4': + resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.4': - resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==} + '@rollup/rollup-linux-riscv64-gnu@4.52.4': + resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.4': + resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.4': - resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==} + '@rollup/rollup-linux-s390x-gnu@4.52.4': + resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.4': - resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==} + '@rollup/rollup-linux-x64-gnu@4.52.4': + resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.4': - resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==} + '@rollup/rollup-linux-x64-musl@4.52.4': + resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.4': - resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==} + '@rollup/rollup-openharmony-arm64@4.52.4': + resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.4': + resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.4': - resolution: {integrity: sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==} + '@rollup/rollup-win32-ia32-msvc@4.52.4': + resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.4': - resolution: {integrity: sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==} + '@rollup/rollup-win32-x64-gnu@4.52.4': + resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} cpu: [x64] os: [win32] - '@rushstack/node-core-library@5.7.0': - resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} + '@rollup/rollup-win32-x64-msvc@4.52.4': + resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@5.13.0': + resolution: {integrity: sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/terminal@0.14.0': - resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} + '@rushstack/terminal@0.15.2': + resolution: {integrity: sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.22.6': - resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} + '@rushstack/ts-command-line@4.23.7': + resolution: {integrity: sha512-Gr9cB7DGe6uz5vq2wdr89WbVDKz0UeuFEn5H2CfWDe7JvjFFaiV15gi6mqDBTbHhHCWS7w8mF1h3BnIfUndqdA==} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@selderee/plugin-htmlparser2@0.11.0': - resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sentry-internal/node-cpu-profiler@2.2.0': + resolution: {integrity: sha512-oLHVYurqZfADPh5hvmQYS5qx8t0UZzT2u6+/68VXsFruQEOnYJTODKgU3BVLmemRs3WE6kCJjPeFdHVYOQGSzQ==} + engines: {node: '>=18'} + + '@sentry/core@10.19.0': + resolution: {integrity: sha512-OqZjYDYsK6ZmBG5UzML0uKiKq//G6mMwPcszfuCsFgPt+pg5giUCrCUbt5VIVkHdN1qEEBk321JO2haU5n2Eig==} + engines: {node: '>=18'} + + '@sentry/nestjs@10.19.0': + resolution: {integrity: sha512-yGNDInvQjW6B4XVVMWmzxkMYLo8ZYJh4DYJN+7UxfD/RDQKbi6b7mSPy+qHdTVqtx8h3OEHUudrLPMqfna6T4g==} + engines: {node: '>=18'} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + + '@sentry/node-core@10.19.0': + resolution: {integrity: sha512-m3xTaIDSh1V88K+e1zaGwKKuhDUAHMX1nncJmsGm8Hwg7FLK2fdr7wm9IJaIF0S1E4R38oHC4kZdL+ebrUghDg==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/instrumentation': '>=0.57.1 <1' + '@opentelemetry/resources': ^1.30.1 || ^2.1.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 + '@opentelemetry/semantic-conventions': ^1.37.0 + + '@sentry/node@10.19.0': + resolution: {integrity: sha512-GUN/UVRsqnXd4O8GCxR8F682nyYemeO4mr0Yc5JPz0CxT2gYkemuifT29bFOont8V5o055WJv32NrQnZcm/nyg==} + engines: {node: '>=18'} - '@shikijs/core@1.22.2': - resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} + '@sentry/opentelemetry@10.19.0': + resolution: {integrity: sha512-o1NWDWXM4flBIqqBECcaZ+y0TS44UxQh5BtTTPJzkU0FsWOytn9lp9ccVi7qBMb7Zrl3rw3Q0BRNETKVG5Ag/w==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 + '@opentelemetry/semantic-conventions': ^1.37.0 + + '@sentry/profiling-node@10.19.0': + resolution: {integrity: sha512-PRFlxHLngxkJkzZkxD6deWtwzUtBo6EYPJkcPneDo/q29skQGtzVfPaWwNTldnOBBfgjtpA90hZLQoKuffxvqA==} + engines: {node: '>=18'} + hasBin: true - '@shikijs/engine-javascript@1.22.2': - resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} - '@shikijs/engine-oniguruma@1.22.2': - resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} - '@shikijs/transformers@1.22.2': - resolution: {integrity: sha512-8f78OiBa6pZDoZ53lYTmuvpFPlWtevn23bzG+azpPVvZg7ITax57o/K3TC91eYL3OMJOO0onPbgnQyZjRos8XQ==} + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} - '@shikijs/types@1.22.2': - resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} - '@shikijs/vscode-textmate@9.3.0': - resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} '@sigstore/bundle@2.3.2': resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} @@ -2562,9 +3409,9 @@ packages: resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} engines: {node: ^16.14.0 || >=18.0.0} - '@sigstore/protobuf-specs@0.3.2': - resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/protobuf-specs@0.3.3': + resolution: {integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==} + engines: {node: ^18.17.0 || >=20.5.0} '@sigstore/sign@2.3.2': resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} @@ -2578,391 +3425,404 @@ packages: resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} engines: {node: ^16.14.0 || >=18.0.0} + '@sinclair/typebox@0.34.41': + resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} engines: {node: '>=18'} '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@smithy/abort-controller@3.1.6': - resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==} - engines: {node: '>=16.0.0'} - - '@smithy/chunked-blob-reader-native@3.0.1': - resolution: {integrity: sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==} - - '@smithy/chunked-blob-reader@4.0.0': - resolution: {integrity: sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==} - - '@smithy/config-resolver@3.0.10': - resolution: {integrity: sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==} - engines: {node: '>=16.0.0'} - - '@smithy/core@2.5.1': - resolution: {integrity: sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==} - engines: {node: '>=16.0.0'} - - '@smithy/credential-provider-imds@3.2.5': - resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==} - engines: {node: '>=16.0.0'} - - '@smithy/eventstream-codec@3.1.7': - resolution: {integrity: sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==} - - '@smithy/eventstream-serde-browser@3.0.11': - resolution: {integrity: sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==} - engines: {node: '>=16.0.0'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@smithy/eventstream-serde-config-resolver@3.0.8': - resolution: {integrity: sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==} - engines: {node: '>=16.0.0'} - - '@smithy/eventstream-serde-node@3.0.10': - resolution: {integrity: sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==} - engines: {node: '>=16.0.0'} + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - '@smithy/eventstream-serde-universal@3.0.10': - resolution: {integrity: sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==} - engines: {node: '>=16.0.0'} + '@smithy/abort-controller@4.2.0': + resolution: {integrity: sha512-PLUYa+SUKOEZtXFURBu/CNxlsxfaFGxSBPcStL13KpVeVWIfdezWyDqkz7iDLmwnxojXD0s5KzuB5HGHvt4Aeg==} + engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@3.2.9': - resolution: {integrity: sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==} + '@smithy/config-resolver@4.3.0': + resolution: {integrity: sha512-9oH+n8AVNiLPK/iK/agOsoWfrKZ3FGP3502tkksd6SRsKMYiu7AFX0YXo6YBADdsAj7C+G/aLKdsafIJHxuCkQ==} + engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@4.0.0': - resolution: {integrity: sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==} + '@smithy/core@3.15.0': + resolution: {integrity: sha512-VJWncXgt+ExNn0U2+Y7UywuATtRYaodGQKFo9mDyh70q+fJGedfrqi2XuKU1BhiLeXgg6RZrW7VEKfeqFhHAJA==} + engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@3.1.7': - resolution: {integrity: sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==} + '@smithy/credential-provider-imds@4.2.0': + resolution: {integrity: sha512-SOhFVvFH4D5HJZytb0bLKxCrSnwcqPiNlrw+S4ZXjMnsC+o9JcUQzbZOEQcA8yv9wJFNhfsUiIUKiEnYL68Big==} + engines: {node: '>=18.0.0'} - '@smithy/hash-node@3.0.8': - resolution: {integrity: sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==} - engines: {node: '>=16.0.0'} + '@smithy/fetch-http-handler@5.3.1': + resolution: {integrity: sha512-3AvYYbB+Dv5EPLqnJIAgYw/9+WzeBiUYS8B+rU0pHq5NMQMvrZmevUROS4V2GAt0jEOn9viBzPLrZE+riTNd5Q==} + engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@3.1.7': - resolution: {integrity: sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==} - engines: {node: '>=16.0.0'} + '@smithy/hash-node@4.2.0': + resolution: {integrity: sha512-ugv93gOhZGysTctZh9qdgng8B+xO0cj+zN0qAZ+Sgh7qTQGPOJbMdIuyP89KNfUyfAqFSNh5tMvC+h2uCpmTtA==} + engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@3.0.8': - resolution: {integrity: sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==} + '@smithy/invalid-dependency@4.2.0': + resolution: {integrity: sha512-ZmK5X5fUPAbtvRcUPtk28aqIClVhbfcmfoS4M7UQBTnDdrNxhsrxYVv0ZEl5NaPSyExsPWqL4GsPlRvtlwg+2A==} + 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@3.0.0': - resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} - engines: {node: '>=16.0.0'} - - '@smithy/md5-js@3.0.8': - resolution: {integrity: sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==} + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@3.0.10': - resolution: {integrity: sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@4.2.0': + resolution: {integrity: sha512-6ZAnwrXFecrA4kIDOcz6aLBhU5ih2is2NdcZtobBDSdSHtE9a+MThB5uqyK4XXesdOCvOcbCm2IGB95birTSOQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@3.2.1': - resolution: {integrity: sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@4.3.1': + resolution: {integrity: sha512-JtM4SjEgImLEJVXdsbvWHYiJ9dtuKE8bqLlvkvGi96LbejDL6qnVpVxEFUximFodoQbg0Gnkyff9EKUhFhVJFw==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@3.0.25': - resolution: {integrity: sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-retry@4.4.1': + resolution: {integrity: sha512-wXxS4ex8cJJteL0PPQmWYkNi9QKDWZIpsndr0wZI2EL+pSSvA/qqxXU60gBOJoIc2YgtZSWY/PE86qhKCCKP1w==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@3.0.8': - resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.2.0': + resolution: {integrity: sha512-rpTQ7D65/EAbC6VydXlxjvbifTf4IH+sADKg6JmAvhkflJO2NvDeyU9qsWUNBelJiQFcXKejUHWRSdmpJmEmiw==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@3.0.8': - resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@4.2.0': + resolution: {integrity: sha512-G5CJ//eqRd9OARrQu9MK1H8fNm2sMtqFh6j8/rPozhEL+Dokpvi1Og+aCixTuwDAGZUkJPk6hJT5jchbk/WCyg==} + engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@3.1.9': - resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==} - engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.3.0': + resolution: {integrity: sha512-5QgHNuWdT9j9GwMPPJCKxy2KDxZ3E5l4M3/5TatSZrqYVoEiqQrDfAq8I6KWZw7RZOHtVtCzEPdYz7rHZixwcA==} + engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@3.2.5': - resolution: {integrity: sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==} - engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@4.3.0': + resolution: {integrity: sha512-RHZ/uWCmSNZ8cneoWEVsVwMZBKy/8123hEpm57vgGXA3Irf/Ja4v9TVshHK2ML5/IqzAZn0WhINHOP9xl+Qy6Q==} + engines: {node: '>=18.0.0'} - '@smithy/property-provider@3.1.8': - resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==} - engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.2.0': + resolution: {integrity: sha512-rV6wFre0BU6n/tx2Ztn5LdvEdNZ2FasQbPQmDOPfV9QQyDmsCkOAB0osQjotRCQg+nSKFmINhyda0D3AnjSBJw==} + engines: {node: '>=18.0.0'} - '@smithy/protocol-http@4.1.5': - resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==} - engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.3.0': + resolution: {integrity: sha512-6POSYlmDnsLKb7r1D3SVm7RaYW6H1vcNcTWGWrF7s9+2noNYvUsm7E4tz5ZQ9HXPmKn6Hb67pBDRIjrT4w/d7Q==} + engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@3.0.8': - resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.2.0': + resolution: {integrity: sha512-Q4oFD0ZmI8yJkiPPeGUITZj++4HHYCW3pYBYfIobUCkYpI6mbkzmG1MAQQ3lJYYWj3iNqfzOenUZu+jqdPQ16A==} + engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@3.0.8': - resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.2.0': + resolution: {integrity: sha512-BjATSNNyvVbQxOOlKse0b0pSezTWGMvA87SvoFoFlkRsKXVsN3bEtjCxvsNXJXfnAzlWFPaT9DmhWy1vn0sNEA==} + engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@3.0.8': - resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==} - engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@4.2.0': + resolution: {integrity: sha512-Ylv1ttUeKatpR0wEOMnHf1hXMktPUMObDClSWl2TpCVT4DwtJhCeighLzSLbgH3jr5pBNM0LDXT5yYxUvZ9WpA==} + engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@3.1.9': - resolution: {integrity: sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==} - engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@4.3.0': + resolution: {integrity: sha512-VCUPPtNs+rKWlqqntX0CbVvWyjhmX30JCtzO+s5dlzzxrvSfRh5SY0yxnkirvc1c80vdKQttahL71a9EsdolSQ==} + engines: {node: '>=18.0.0'} - '@smithy/signature-v4@4.2.0': - resolution: {integrity: sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ==} - engines: {node: '>=16.0.0'} + '@smithy/signature-v4@5.3.0': + resolution: {integrity: sha512-MKNyhXEs99xAZaFhm88h+3/V+tCRDQ+PrDzRqL0xdDpq4gjxcMmf5rBA3YXgqZqMZ/XwemZEurCBQMfxZOWq/g==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@3.4.2': - resolution: {integrity: sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==} - engines: {node: '>=16.0.0'} + '@smithy/smithy-client@4.7.1': + resolution: {integrity: sha512-WXVbiyNf/WOS/RHUoFMkJ6leEVpln5ojCjNBnzoZeMsnCg3A0BRhLK3WYc4V7PmYcYPZh9IYzzAg9XcNSzYxYQ==} + engines: {node: '>=18.0.0'} - '@smithy/types@3.6.0': - resolution: {integrity: sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==} - engines: {node: '>=16.0.0'} + '@smithy/types@4.6.0': + resolution: {integrity: sha512-4lI9C8NzRPOv66FaY1LL1O/0v0aLVrq/mXP/keUa9mJOApEeae43LsLd2kZRUJw91gxOQfLIrV3OvqPgWz1YsA==} + engines: {node: '>=18.0.0'} - '@smithy/url-parser@3.0.8': - resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==} + '@smithy/url-parser@4.2.0': + resolution: {integrity: sha512-AlBmD6Idav2ugmoAL6UtR6ItS7jU5h5RNqLMZC7QrLCoITA9NzIN3nx9GWi8g4z1pfWh2r9r96SX/jHiNwPJ9A==} + engines: {node: '>=18.0.0'} - '@smithy/util-base64@3.0.0': - resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@3.0.0': - resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@3.0.0': - resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} - engines: {node: '>=16.0.0'} + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + 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@3.0.0': - resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} - engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@3.0.0': - resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@3.0.25': - resolution: {integrity: sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-browser@4.3.0': + resolution: {integrity: sha512-H4MAj8j8Yp19Mr7vVtGgi7noJjvjJbsKQJkvNnLlrIFduRFT5jq5Eri1k838YW7rN2g5FTnXpz5ktKVr1KVgPQ==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@3.0.25': - resolution: {integrity: sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-node@4.2.1': + resolution: {integrity: sha512-PuDcgx7/qKEMzV1QFHJ7E4/MMeEjaA7+zS5UNcHCLPvvn59AeZQ0DSDGMpqC2xecfa/1cNGm4l8Ec/VxCuY7Ug==} + engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@2.1.4': - resolution: {integrity: sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-endpoints@3.2.0': + resolution: {integrity: sha512-TXeCn22D56vvWr/5xPqALc9oO+LN+QpFjrSM7peG/ckqEPoI3zaKZFp+bFwfmiHhn5MGWPaLCqDOJPPIixk9Wg==} + engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@3.0.0': - resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} - '@smithy/util-middleware@3.0.8': - resolution: {integrity: sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==} - engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.2.0': + resolution: {integrity: sha512-u9OOfDa43MjagtJZ8AapJcmimP+K2Z7szXn8xbty4aza+7P1wjFmy2ewjSbhEiYQoW1unTlOAIV165weYAaowA==} + engines: {node: '>=18.0.0'} - '@smithy/util-retry@3.0.8': - resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==} - engines: {node: '>=16.0.0'} + '@smithy/util-retry@4.2.0': + resolution: {integrity: sha512-BWSiuGbwRnEE2SFfaAZEX0TqaxtvtSYPM/J73PFVm+A29Fg1HTPiYFb8TmX1DXp4hgcdyJcNQmprfd5foeORsg==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@3.2.1': - resolution: {integrity: sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==} - engines: {node: '>=16.0.0'} + '@smithy/util-stream@4.5.0': + resolution: {integrity: sha512-0TD5M5HCGu5diEvZ/O/WquSjhJPasqv7trjoqHyWjNh/FBeBl7a0ztl9uFMOsauYtRfd8jvpzIAQhDHbx+nvZw==} + engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@3.0.0': - resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} - engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + 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@3.0.0': - resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} - engines: {node: '>=16.0.0'} + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} - '@smithy/util-waiter@3.1.7': - resolution: {integrity: sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-waiter@4.2.0': + resolution: {integrity: sha512-0Z+nxUU4/4T+SL8BCNN4ztKdQjToNvUYmkF1kXO5T7Yz3Gafzh0HeIG6mrkN8Fz3gn9hSyxuAT+6h4vM+iQSBQ==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} - '@studion/infra-code-blocks@0.6.11': - resolution: {integrity: sha512-u+oT5O6rEsL+ufD7TBp5PmHxjXAZpuJtHBwFc5KAYgE5h2djixgb2JkpLNO7UV4VHdNJdYU+nVQaoH4lsevtvA==} + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} - '@stylistic/eslint-plugin@2.10.1': - resolution: {integrity: sha512-U+4yzNXElTf9q0kEfnloI9XbOyD4cnEQCxjUI94q0+W++0GAEQvJ/slwEj9lwjDHfGADRSr+Tco/z0XJvmDfCQ==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@studion/infra-code-blocks@0.7.0': + resolution: {integrity: sha512-8WGjSnwBIgphzoWtMBHAJpuAZURJBDVDklBgAst5c9fkxzXp5VnwZZL3bbPpf8p93dM8AITbxN5c0cLJ9cEd/g==} + + '@stylistic/eslint-plugin@5.4.0': + resolution: {integrity: sha512-UG8hdElzuBDzIbjG1QDwnYH0MQ73YLXDFHgZzB4Zh/YJfnw8XNsloVtytqzx0I2Qky9THSdpTmi8Vjn/pf/Lew==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=8.40.0' + eslint: '>=9.0.0' '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tiptap/core@2.9.1': - resolution: {integrity: sha512-tifnLL/ARzQ6/FGEJjVwj9UT3v+pENdWHdk9x6F3X0mB1y0SeCjV21wpFLYESzwNdBPAj8NMp8Behv7dBnhIfw==} + '@tiptap/core@2.26.3': + resolution: {integrity: sha512-TaOJzu2v5ufsOx+yu94NqXE504zmupVdFCxH1g3hk5fzZ3gT57Lh9R/27OjwM4e6o+Z3DXDl8yfFMHIcR3zUkg==} peerDependencies: '@tiptap/pm': ^2.7.0 - '@tiptap/extension-blockquote@2.9.1': - resolution: {integrity: sha512-Y0jZxc/pdkvcsftmEZFyG+73um8xrx6/DMfgUcNg3JAM63CISedNcr+OEI11L0oFk1KFT7/aQ9996GM6Kubdqg==} + '@tiptap/extension-blockquote@2.26.3': + resolution: {integrity: sha512-brz8+wh03TuMevNUztTSC9BzZEsLCNakPJCCicD8FRpBJoLj4benT6T3GYVdMhkk4BmhpruSFZB0FPY+rxCVlA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bold@2.9.1': - resolution: {integrity: sha512-e2P1zGpnnt4+TyxTC5pX/lPxPasZcuHCYXY0iwQ3bf8qRQQEjDfj3X7EI+cXqILtnhOiviEOcYmeu5op2WhQDg==} + '@tiptap/extension-bold@2.26.3': + resolution: {integrity: sha512-ssXKQxSwQ+Webv65emK/A1d13iTvnfbw8I2wlzuxsrMChyb4wH2HyqI5N4g0FpLqCpkXFumforoY+0XKktve+w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-bubble-menu@2.9.1': - resolution: {integrity: sha512-DWUF6NG08/bZDWw0jCeotSTvpkyqZTi4meJPomG9Wzs/Ol7mEwlNCsCViD999g0+IjyXFatBk4DfUq1YDDu++Q==} + '@tiptap/extension-bubble-menu@2.26.3': + resolution: {integrity: sha512-vliC5bv/md4qkguqqL8w7LW8jnXBD1FLdSMDavHRVwdRaRnEfLRAIY7Oxtc1Voy3+762tfn912TuwDlCOPsNSQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-bullet-list@2.9.1': - resolution: {integrity: sha512-0hizL/0j9PragJObjAWUVSuGhN1jKjCFnhLQVRxtx4HutcvS/lhoWMvFg6ZF8xqWgIa06n6A7MaknQkqhTdhKA==} + '@tiptap/extension-bullet-list@2.26.3': + resolution: {integrity: sha512-pfBMOup1JbXgf2aVTtG1A5t7qFZJrpD+wNPuypjF2YWmCl/pAlwbPFz9hNuWyZq14+QoQg5tML1/G1M7cgrrtw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-character-count@2.9.1': - resolution: {integrity: sha512-1V4gi+jA2B0W0aB8dH9W60YitZF88R5+Ck9LsxHsaEBRxPym+s382cYl1A7mXJyvv51WzYlr72iX4S0cdl3KOw==} + '@tiptap/extension-character-count@3.6.6': + resolution: {integrity: sha512-Doh4Td71t7qy3O6mTrYrR1Z6P56lY6b78wb2i1GAVEHg7nQ3Dh6hgH0UyIQ0tfxK3QuH4LF3IgfVsDXzdZ2sFw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extensions': ^3.6.6 - '@tiptap/extension-code-block@2.9.1': - resolution: {integrity: sha512-A/50wPWDqEUUUPhrwRKILP5gXMO5UlQ0F6uBRGYB9CEVOREam9yIgvONOnZVJtszHqOayjIVMXbH/JMBeq11/g==} + '@tiptap/extension-code-block@2.26.3': + resolution: {integrity: sha512-3DbzKRfMqw9EGS7mGkpyopbRWTO+qpV52Mby4Ll2+OfhvGnHzSN4Q7xOsp+VeZr14GMEmua5Oq2e/gRypqXatQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code@2.9.1': - resolution: {integrity: sha512-WQqcVGe7i/E+yO3wz5XQteU1ETNZ00euUEl4ylVVmH2NM4Dh0KDjEhbhHlCM0iCfLUo7jhjC7dmS+hMdPUb+Tg==} + '@tiptap/extension-code@2.26.3': + resolution: {integrity: sha512-bAkUNzV+tA1J1RYbtbAGTFqkRw9+yRpAd+d3S9jy/dAD+uOe1ZD1EIngyEf2GTonnoy4bpDYtytbCjUt9PozoA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-document@2.9.1': - resolution: {integrity: sha512-1a+HCoDPnBttjqExfYLwfABq8MYdiowhy/wp8eCxVb6KGFEENO53KapstISvPzqH7eOi+qRjBB1KtVYb/ZXicg==} + '@tiptap/extension-document@2.26.3': + resolution: {integrity: sha512-gcJg4Otchilr4eSUwhPNwbhPUkEYvXhkUZ/1MAhVGD40Ovq2P8ZWkJipA3tKOCJinL5MJK59ccZBstnKSTw+JA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-dropcursor@2.9.1': - resolution: {integrity: sha512-wJZspSmJRkDBtPkzFz1g7gvZOEOayk8s93UHsgbJxcV4VWHYleZ5XhT74sZunSjefNDm3qC6v2BSgLp3vNHVKQ==} + '@tiptap/extension-dropcursor@2.26.3': + resolution: {integrity: sha512-54rgDTmRStVmXZR7KdCvSOCAbumh5luXgticUkRM8OM8PBe1c0T9X8jfV7+XEFGugRVl8mtCZZpgUt5vhuxHog==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-floating-menu@2.9.1': - resolution: {integrity: sha512-MxZ7acNNsoNaKpetxfwi3Z11Bgrh0T2EJlCV77v9N1vWK38+st3H1WJanmLbPNtc2ocvhHJrz+DjDz3CWxQ9rQ==} + '@tiptap/extension-floating-menu@2.26.3': + resolution: {integrity: sha512-i2dsIMa0L6vjCPnTiXjPZXZqUu3sIIIAI+E1T4p0FsGYjjPTmN+AgkJqeO3bbe5XHmWcWKtgQevNCMF0kmU5rQ==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-gapcursor@2.9.1': - resolution: {integrity: sha512-jsRBmX01vr+5H02GljiHMo0n5H1vzoMLmFarxe0Yq2d2l9G/WV2VWX2XnGliqZAYWd1bI0phs7uLQIN3mxGQTw==} + '@tiptap/extension-gapcursor@2.26.3': + resolution: {integrity: sha512-ZDNSkpz7ik2PJOjrys27rwko5Ufe6GtLjaAxjvkWmyzcgAOTadDeth9NaRdBVMDGgSLBKbXihYZZXLkiAP9RLA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-hard-break@2.9.1': - resolution: {integrity: sha512-fCuaOD/b7nDjm47PZ58oanq7y4ccS2wjPh42Qm0B0yipu/1fmC8eS1SmaXmk28F89BLtuL6uOCtR1spe+lZtlQ==} + '@tiptap/extension-hard-break@2.26.3': + resolution: {integrity: sha512-KJWUi+2KOZejVRb2KI0NM3LgCpNimxcunbOCKsZKygV/UByzhUl7UaCAIa+ySMM+kbu/Ec3hkTzafGfaU9ZkLg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-heading@2.9.1': - resolution: {integrity: sha512-SjZowzLixOFaCrV2cMaWi1mp8REK0zK1b3OcVx7bCZfVSmsOETJyrAIUpCKA8o60NwF7pwhBg0MN8oXlNKMeFw==} + '@tiptap/extension-heading@2.26.3': + resolution: {integrity: sha512-bp7YildFOustuGJGl8TInG26h7xbcpBKskm49TjwyBjUqRHPGH4V11554afStAr+bsTlPN4TDXt7extvq3UYLA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-history@2.9.1': - resolution: {integrity: sha512-wp9qR1NM+LpvyLZFmdNaAkDq0d4jDJ7z7Fz7icFQPu31NVxfQYO3IXNmvJDCNu8hFAbImpA5aG8MBuwzRo0H9w==} + '@tiptap/extension-history@2.26.3': + resolution: {integrity: sha512-Qg4+WWf/hDgiBspxLbrhrIFUy7lzi2eBKPSoF/haEYFw/t/FeN60NXYYYtpLimUNpUzyJSOSIwsngFcVJO5X+g==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-horizontal-rule@2.9.1': - resolution: {integrity: sha512-ydUhABeaBI1CoJp+/BBqPhXINfesp1qMNL/jiDcMsB66fsD4nOyphpAJT7FaRFZFtQVF06+nttBtFZVkITQVqg==} + '@tiptap/extension-horizontal-rule@2.26.3': + resolution: {integrity: sha512-NhlJEDj0b/P1Rj4UOMgt4CjS4IXEhXQFsdiXmsYZxchfr4J72HrsOfZs4vAqIQbkrLgUlYEr/DGMNWzME78FrA==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-italic@2.9.1': - resolution: {integrity: sha512-VkNA6Vz96+/+7uBlsgM7bDXXx4b62T1fDam/3UKifA72aD/fZckeWrbT7KrtdUbzuIniJSbA0lpTs5FY29+86Q==} + '@tiptap/extension-italic@2.26.3': + resolution: {integrity: sha512-DJX31JQsyerqoNM+hAtbjHoJ42W/EpnMMCtQr/gRS8ssEdrVtcDDhSO2tkaP6dNjhG8zH2hKYsXpLCCFdDgvwg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-list-item@2.9.1': - resolution: {integrity: sha512-6O4NtYNR5N2Txi4AC0/4xMRJq9xd4+7ShxCZCDVL0WDVX37IhaqMO7LGQtA6MVlYyNaX4W1swfdJaqrJJ5HIUw==} + '@tiptap/extension-list-item@2.26.3': + resolution: {integrity: sha512-9qU0SoC+tDSKYhfdWFS3dkioEk3ml1ycBeRmOxh7h+w0ezmTomiT5yvc9t3KM30ps8n1p78sIPo19GF65u1dFQ==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-ordered-list@2.9.1': - resolution: {integrity: sha512-6J9jtv1XP8dW7/JNSH/K4yiOABc92tBJtgCsgP8Ep4+fjfjdj4HbjS1oSPWpgItucF2Fp/VF8qg55HXhjxHjTw==} + '@tiptap/extension-ordered-list@2.26.3': + resolution: {integrity: sha512-x6G0qA7dAvSq+kphA7P64m+ScoVEAW8s9pl7o3jIJzcIW/LrbL1xkyOjbgCvGEvwyQVsgyqtLQDQ2oeloosDBw==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-paragraph@2.9.1': - resolution: {integrity: sha512-JOmT0xd4gd3lIhLwrsjw8lV+ZFROKZdIxLi0Ia05XSu4RLrrvWj0zdKMSB+V87xOWfSB3Epo95zAvnPox5Q16A==} + '@tiptap/extension-paragraph@2.26.3': + resolution: {integrity: sha512-eBC5UsaTJRUMhePtK1dcCAfes0CpqqFiewpIM0lWk4XMtpG2aoczVVVkImybbFKfqsvEEo3vgHJ2YiE5YZFCSg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-strike@2.9.1': - resolution: {integrity: sha512-V5aEXdML+YojlPhastcu7w4biDPwmzy/fWq0T2qjfu5Te/THcqDmGYVBKESBm5x6nBy5OLkanw2O+KHu2quDdg==} + '@tiptap/extension-strike@2.26.3': + resolution: {integrity: sha512-Po3al5hP0IwvHHIHYy3DbUvCD/kbYTsi3sWTjPAB9QgqaoJGl+jyhIyha8FsR+U3MCIIJIekMktI5o1+ySMGpg==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-subscript@2.9.1': - resolution: {integrity: sha512-jjfuHmF2dCUAtHmJH2K/7HhOCleM3aPVOI/UsBBYa8xM4mDU4xuW1O5sLAr2JWcB1xxyk9YKcBWwyRq+b1ENFA==} + '@tiptap/extension-subscript@3.6.6': + resolution: {integrity: sha512-S6PSD1YFDSNI8MGsaYipKEayJiOk6C1yB3rF47FtpuhtILaTzl2O/OdUc1u+LIO9OjIORCNkV4jPPfhwn+cI7g==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.6.6 + '@tiptap/pm': ^3.6.6 - '@tiptap/extension-superscript@2.9.1': - resolution: {integrity: sha512-7cgAPpUNgO/3QdvCN9/6dWP6JQC641o8dSgkyv0XzVv0nxISck4SU+2eADRYQLyP2s4M3xuSEFhCCiKZleK2yA==} + '@tiptap/extension-superscript@3.6.6': + resolution: {integrity: sha512-HHjwp2xuTE2YpSfPeS11tTDe3Eb/D6CbGBCXrwGLZw/LPFwHrbnBYIsxxbc5kLvRSXOQYqhF/E0zHedtJHYvsg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.6.6 + '@tiptap/pm': ^3.6.6 - '@tiptap/extension-text-style@2.9.1': - resolution: {integrity: sha512-LAxc0SeeiPiAVBwksczeA7BJSZb6WtVpYhy5Esvy9K0mK5kttB4KxtnXWeQzMIJZQbza65yftGKfQlexf/Y7yg==} + '@tiptap/extension-text-style@2.26.3': + resolution: {integrity: sha512-B+t6k41xtmlIxyi0r+g8MAShGMCK6kmz8EdxoLAUVrlCxYWVk6qvzoojZbjQKlb2sE+idIo4X5yCcKpdkxFe0w==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-text@2.9.1': - resolution: {integrity: sha512-3wo9uCrkLVLQFgbw2eFU37QAa1jq1/7oExa+FF/DVxdtHRS9E2rnUZ8s2hat/IWzvPUHXMwo3Zg2XfhoamQpCA==} + '@tiptap/extension-text@2.26.3': + resolution: {integrity: sha512-sGRbX96ss4jQeKw9d0iphuAWja8Dv4w4ryTDKfxD7Lizx3UaIxQB/y+Wna89tM3kfbi/qJcrD3AF7NJgfc/tEA==} peerDependencies: '@tiptap/core': ^2.7.0 - '@tiptap/extension-underline@2.9.1': - resolution: {integrity: sha512-IrUsIqKPgD7GcAjr4D+RC0WvLHUDBTMkD8uPNEoeD1uH9t9zFyDfMRPnx/z3/6Gf6fTh3HzLcHGibiW2HiMi2A==} + '@tiptap/extension-underline@3.6.6': + resolution: {integrity: sha512-PXhWYTZHM9IvGr3ElJl25qsyvKUejlul9TpFeBHv2awTY+0xoUL9FeEwOWOGx3sk8XTrz15b0/gjsgOV6U6Hiw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.6.6 + + '@tiptap/extensions@3.6.6': + resolution: {integrity: sha512-+U4ppBItDa75HVeJ861G/O1F1nKPUkTgM2Qed9akPx/IB8ELuOUXNEytIHPONqx0XqjJ+953fQans2xQowMBjg==} + peerDependencies: + '@tiptap/core': ^3.6.6 + '@tiptap/pm': ^3.6.6 - '@tiptap/pm@2.9.1': - resolution: {integrity: sha512-mvV86fr7kEuDYEApQ2uMPCKL2uagUE0BsXiyyz3KOkY1zifyVm1fzdkscb24Qy1GmLzWAIIihA+3UHNRgYdOlQ==} + '@tiptap/pm@2.26.3': + resolution: {integrity: sha512-8gUmdxWlUevmgq2mNvGxvf2CpDW097tVKECMWKEn8sf846kXv3CoqaGRhI3db4kfR+09uWZeRM7rtrjRBmUThg==} - '@tiptap/starter-kit@2.9.1': - resolution: {integrity: sha512-nsw6UF/7wDpPfHRhtGOwkj1ipIEiWZS1VGw+c14K61vM1CNj0uQ4jogbHwHZqN1dlL5Hh+FCqUHDPxG6ECbijg==} + '@tiptap/starter-kit@2.26.3': + resolution: {integrity: sha512-hznj/j+mFIuKfNB0ToaZVcVjdtpSOHoBoX3ocSz9BaYCtK+nX1c0gTlfbJ1BcpYUZNtqG+tpUeIfvXifRkq/OQ==} - '@tiptap/vue-3@2.9.1': - resolution: {integrity: sha512-51mKa4C3hdKe+o6G7Pk7d4puZ/VjoHWtTo2WxE249oH+bCkh6FObqNu2wfRK+9obVuTGXQ9dAc988cmwY+2eyw==} + '@tiptap/vue-3@2.26.3': + resolution: {integrity: sha512-UxEwRee0WOsOIr0IMHIOBecrrc3unh3xExgPDZJ7Zo6FAVy+D6wDEGPbcU4TbV6PPdamTAfS/xb5J9LAIY6UZw==} peerDependencies: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 vue: ^3.0.0 - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + '@tokenizer/inflate@0.2.7': + resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@ts-morph/common@0.28.1': + resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} @@ -2972,17 +3832,35 @@ packages: resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} engines: {node: ^16.14.0 || >=18.0.0} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/aws-lambda@8.10.143': - resolution: {integrity: sha512-u5vzlcR14ge/4pMTTMDQr3MF0wEe38B2F9o84uC4F43vN5DGTy63npRrB6jQhyt+C0lGv4ZfiRcRkqJoZuPnmg==} + '@types/aws-lambda@8.10.155': + resolution: {integrity: sha512-wd1XgoL0gy/ybo7WozUKQBd+IOgUkdfG6uUGI0fQOTEq06FBFdO7tmPDSxgjkFkl8GlfApvk5TvqZlAl0g+Lbg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/bcrypt@6.0.0': + resolution: {integrity: sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==} '@types/bluebird@3.5.42': resolution: {integrity: sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -2990,44 +3868,74 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookie-parser@1.4.9': + resolution: {integrity: sha512-tGZiZ2Gtc4m3wIdLkZ8mkj1T6CEHb35+VApbL2T14Dew8HA7c+04dmKqsKRNC+8RJPm16JEK0tFSwdZqubfc4g==} + peerDependencies: + '@types/express': '*' + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@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/express-serve-static-core@5.0.1': - resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express@5.0.0': - resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} '@types/google-protobuf@3.15.12': resolution: {integrity: sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==} + '@types/handlebars@4.1.0': + resolution: {integrity: sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==} + deprecated: This is a stub types definition. handlebars provides its own type definitions, so you do not need this installed. + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - '@types/http-proxy@1.17.15': - resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.20': + resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==} '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} @@ -3038,32 +3946,48 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/multer@2.0.0': + resolution: {integrity: sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/node@24.7.2': + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} - '@types/node-fetch@2.6.11': - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + '@types/nodemailer@7.0.2': + resolution: {integrity: sha512-Zo6uOA9157WRgBk/ZhMpTQ/iCWLMk7OIs/Q9jvHarMvrzUUP/MDdPHL2U1zpf57HrrWGv4nYQn5uIxna0xY3xw==} - '@types/node@18.19.45': - resolution: {integrity: sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==} + '@types/parse-path@7.1.0': + resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} + deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. - '@types/node@22.5.0': - resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} + '@types/passport-jwt@4.0.1': + resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} - '@types/node@22.9.0': - resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==} + '@types/passport-local@1.0.38': + resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/passport-strategy@0.2.38': + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + + '@types/passport@1.0.17': + resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} + + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.15.5': + resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} '@types/pluralize@0.0.33': resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==} @@ -3071,8 +3995,8 @@ packages: '@types/promise-queue@2.2.3': resolution: {integrity: sha512-CuEQpGSYKvHr3SQ7C7WkluLg9CFjVORbn8YFRsQ5u6mqGbZVfSOv03ic9t95HtZuMchnlNqnIsQGFOpxqdhjTQ==} - '@types/qs@6.9.17': - resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -3083,319 +4007,356 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@1.2.0': + resolution: {integrity: sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.9': + resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==} + + '@types/set-cookie-parser@2.4.10': + resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.9': + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} + + '@types/supertest@6.0.3': + resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/tmp@0.2.6': resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/validator@13.12.1': - resolution: {integrity: sha512-w0URwf7BQb0rD/EuiG12KP0bailHKHP5YVviJG9zw3ykAokL0TuxU2TUqMB7EwZ59bDHYdeTIvjI5m0S7qHfOA==} + '@types/uuid@11.0.0': + resolution: {integrity: sha512-HVyk8nj2m+jcFRNazzqyVKiZezyhDKrGUA3jlEcg/nZ6Ms+qHwocba1Y/AaVaznJTAM9xpdFSh+ptbNrhOGvZA==} + deprecated: This is a stub types definition. uuid provides its own type definitions, so you do not need this installed. + + '@types/validator@13.15.3': + resolution: {integrity: sha512-7bcUmDyS6PN3EuD9SlGGOxM77F8WLVsrwkxyWxKnxzmXoequ6c7741QBrANq6htVRGOITJ7z72mTP6Z4XyuG+Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.13.0': - resolution: {integrity: sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==} + '@typescript-eslint/eslint-plugin@8.46.0': + resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.46.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@8.13.0': - resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} + '@typescript-eslint/parser@8.46.0': + resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@8.13.0': - resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} + '@typescript-eslint/project-service@8.46.0': + resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.2.0': - resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==} + '@typescript-eslint/scope-manager@8.46.0': + resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.13.0': - resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} + '@typescript-eslint/tsconfig-utils@8.46.0': + resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@8.13.0': - resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.2.0': - resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==} + '@typescript-eslint/type-utils@8.46.0': + resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.13.0': - resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} + '@typescript-eslint/types@8.46.0': + resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.2.0': - resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==} + '@typescript-eslint/typescript-estree@8.46.0': + resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.13.0': - resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} + '@typescript-eslint/utils@8.46.0': + resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.2.0': - resolution: {integrity: sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==} + '@typescript-eslint/visitor-keys@8.46.0': + resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unhead/vue@2.0.19': + resolution: {integrity: sha512-7BYjHfOaoZ9+ARJkT10Q2TjnTUqDXmMpfakIAsD/hXiuff1oqWg1xeXT5+MomhNcC15HbiABpbbBmITLSHxdKg==} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + vue: '>=3.5.18' - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] - '@typescript-eslint/visitor-keys@8.13.0': - resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] - '@typescript-eslint/visitor-keys@8.2.0': - resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] - '@unhead/dom@1.11.11': - resolution: {integrity: sha512-4YwziCH5CmjvUzSGdZ4Klj6BqhLSTNZooA9kt47yDxj4Qw9uHqVnXwWWupYsVdIYPNsw1tR2AkHveg82y1Fn3A==} + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] - '@unhead/schema@1.11.11': - resolution: {integrity: sha512-xSGsWHPBYcMV/ckQeImbrVu6ddeRnrdDCgXUKv3xIjGBY+ob/96V80lGX8FKWh8GwdFSwhblISObKlDAt5K9ZQ==} + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] - '@unhead/shared@1.11.11': - resolution: {integrity: sha512-RfdvUskPn90ipO+PmR98jKZ8Lsx1uuzscOenO5xcrMrtWGhlLWaEBIrbvFOvX5PZ/u8/VNMJChTXGDUjEtHmlg==} + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] - '@unhead/ssr@1.11.11': - resolution: {integrity: sha512-NQC8y+4ldwkMr3x8WFwv3+OR6g+Sj7dwL6J/3ST25KnvlwDSub2KGbnm2hF1x8vTpTmXTVxMA3GDRL9MRfLvMg==} + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] - '@unhead/vue@1.11.11': - resolution: {integrity: sha512-AxsHHauZ+w0m2irwDHqkc3GdNChMLBtolk8CN3IAZM6vTwH0EbPXlFCFcIk4WwkH0opG+R2GlKTThr5H0HLm7g==} - peerDependencies: - vue: '>=2.7 || >=3' + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] - '@upstash/pulumi@0.2.0': - resolution: {integrity: sha512-wxc8UGP9+4ccFwQes6FWvo4/Cia8LeLl8q1VXUoeuGHL67A1oQQmIIQ5HSFtGzOxh6t6GPlg3+kummsCReJ4Qg==} + '@upstash/pulumi@0.3.14': + resolution: {integrity: sha512-tM0muzOEGmOBVu1J8rY86ThaV4iuZE+tfB+hc84dHPHP9jkSgUcDxBIVRRUs22/5O6Tt9R0hcigJBSGNWvIWfA==} - '@vee-validate/i18n@4.14.6': - resolution: {integrity: sha512-NXxwGuYcm9rxMyfmEQUVWnCEhYurrihGHFjGOQPBtooJuIdfw8UEroHSFpmyXlSrBFI0GvcDlCqYe8SyLzq5mg==} + '@vee-validate/i18n@4.15.1': + resolution: {integrity: sha512-6ogEyxkoTr7IZk4EAUT0rD3pr34Nw/YEToez/c0DSlI1/cBeOpunSmGmoYPh32pmd3imxFPEawCB7IyFvRJSAw==} - '@vee-validate/rules@4.14.6': - resolution: {integrity: sha512-aq2AGKyovW+1TrJ8I8y4b/KshyAyNJr3Ar7PDSRE1LaMNhJrb8TmjU/30T2jZjpvBd93S1x8Pdxk6QXG4GsH3w==} + '@vee-validate/rules@4.15.1': + resolution: {integrity: sha512-2TGXq2MYt21nT8ysuxyFY/LBVQDcMPKn1hY0w3uIDmG333vzBkOtXAylmvrS93AsJ7N5coHMJjcCGG4JxCO2hQ==} - '@vercel/nft@0.27.6': - resolution: {integrity: sha512-mwuyUxskdcV8dd7N7JnxBgvFEz1D9UOePI/WyLLzktv6HSCwgPNQGit/UJ2IykAWGlypKw4pBQjOKWvIbXITSg==} - engines: {node: '>=16'} + '@vercel/nft@0.30.2': + resolution: {integrity: sha512-pquXF3XZFg/T3TBor08rUhIGgOhdSilbn7WQLVP/aVSSO+25Rs4H/m3nxNDQ2x3znX7Z3yYjryN8xaLwypcwQg==} + engines: {node: '>=18'} hasBin: true - '@vitejs/plugin-vue-jsx@4.0.1': - resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==} - engines: {node: ^18.0.0 || >=20.0.0} + '@vitejs/plugin-vue-jsx@5.1.1': + resolution: {integrity: sha512-uQkfxzlF8SGHJJVH966lFTdjM/lGcwJGzwAHpVqAPDD/QcsqoUGa+q31ox1BrUfi+FLP2ChVp7uLXE3DkHyDdQ==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vue: ^3.0.0 - '@vitejs/plugin-vue@5.1.4': - resolution: {integrity: sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==} + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 + vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.6': - resolution: {integrity: sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==} + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 - '@volar/source-map@2.4.6': - resolution: {integrity: sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==} + '@volar/language-core@2.4.23': + resolution: {integrity: sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==} - '@volar/typescript@2.4.6': - resolution: {integrity: sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==} + '@volar/source-map@2.4.23': + resolution: {integrity: sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==} - '@vue-macros/common@1.12.2': - resolution: {integrity: sha512-+NGfhrPvPNOb3Wg9PNPEXPe0HTXmVe6XJawL1gi3cIjOSGIhpOdvmMT2cRuWb265IpA/PeL5Sqo0+DQnEDxLvw==} - engines: {node: '>=16.14.0'} + '@vue-macros/common@3.0.0-beta.16': + resolution: {integrity: sha512-8O2gWxWFiaoNkk7PGi0+p7NPGe/f8xJ3/INUufvje/RZOs7sJvlI1jnR4lydtRFa/mU0ylMXUXXjSK0fHDEYTA==} + engines: {node: '>=20.18.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 peerDependenciesMeta: vue: optional: true - '@vue/babel-helper-vue-transform-on@1.2.2': - resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} + '@vue/babel-helper-vue-transform-on@1.5.0': + resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} - '@vue/babel-plugin-jsx@1.2.2': - resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} + '@vue/babel-plugin-jsx@1.5.0': + resolution: {integrity: sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==} peerDependencies: '@babel/core': ^7.0.0-0 peerDependenciesMeta: '@babel/core': optional: true - '@vue/babel-plugin-resolve-type@1.2.2': - resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} + '@vue/babel-plugin-resolve-type@1.5.0': + resolution: {integrity: sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==} peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.4.38': - resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} - '@vue/compiler-core@3.5.12': - resolution: {integrity: sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==} + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} - '@vue/compiler-dom@3.4.38': - resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} - '@vue/compiler-dom@3.5.12': - resolution: {integrity: sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==} - - '@vue/compiler-sfc@3.5.12': - resolution: {integrity: sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==} - - '@vue/compiler-ssr@3.5.12': - resolution: {integrity: sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==} - - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-api@7.6.3': - resolution: {integrity: sha512-H2TRzFA9hNezdtM6I0y3RCMhIg5T3gib/p9qI2IAS8gB9tvkAv4JZHAZZl5BZHhO7btuHkvHzU5qpO/vdsjYMg==} - - '@vue/devtools-core@7.3.3': - resolution: {integrity: sha512-i6Bwkx4OwfY0QVHjAdsivhlzZ2HMj7fbNRYJsWspQ+dkA1f3nTzycPqZmVUsm2TGkbQlhTMhCAdDoP97JKoc+g==} + '@vue/devtools-api@7.7.7': + resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} - '@vue/devtools-core@7.4.4': - resolution: {integrity: sha512-DLxgA3DfeADkRzhAfm3G2Rw/cWxub64SdP5b+s5dwL30+whOGj+QNhmyFpwZ8ZTrHDFRIPj0RqNzJ8IRR1pz7w==} + '@vue/devtools-core@7.7.7': + resolution: {integrity: sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@7.3.3': - resolution: {integrity: sha512-m+dFI57BrzKYPKq73mt4CJ5GWld5OLBseLHPHGVP7CaILNY9o1gWVJWAJeF8XtQ9LTiMxZSaK6NcBsFuxAhD0g==} + '@vue/devtools-kit@7.7.7': + resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} - '@vue/devtools-kit@7.4.4': - resolution: {integrity: sha512-awK/4NfsUG0nQ7qnTM37m7ZkEUMREyPh8taFCX+uQYps/MTFEum0AD05VeGDRMXwWvMmGIcWX9xp8ZiBddY0jw==} + '@vue/devtools-shared@7.7.7': + resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} - '@vue/devtools-kit@7.6.3': - resolution: {integrity: sha512-ETsFc8GlOp04rSFN79tB2TpVloWfsSx9BoCSElV3w3CaJTSBfz42KsIi5Ka+dNTJs1jY7QVLTDeoBmUGgA9h2A==} - - '@vue/devtools-shared@7.3.9': - resolution: {integrity: sha512-CdfMRZKXyI8vw+hqOcQIiLihB6Hbbi7WNZGp7LsuH1Qe4aYAFmTaKjSciRZ301oTnwmU/knC/s5OGuV6UNiNoA==} - - '@vue/devtools-shared@7.6.3': - resolution: {integrity: sha512-wJW5QF27i16+sNQIaes8QoEZg1eqEgF83GkiPUlEQe9k7ZoHXHV7PRrnrxOKem42sIHPU813J2V/ZK1uqTJe6g==} - - '@vue/language-core@2.1.6': - resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} + '@vue/language-core@3.1.1': + resolution: {integrity: sha512-qjMY3Q+hUCjdH+jLrQapqgpsJ0rd/2mAY02lZoHG3VFJZZZKLjAlV+Oo9QmWIT4jh8+Rx8RUGUi++d7T9Wb6Mw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@vue/reactivity@3.5.12': - resolution: {integrity: sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==} + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} - '@vue/runtime-core@3.5.12': - resolution: {integrity: sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==} + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} - '@vue/runtime-dom@3.5.12': - resolution: {integrity: sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==} + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} - '@vue/server-renderer@3.5.12': - resolution: {integrity: sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==} + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} peerDependencies: - vue: 3.5.12 - - '@vue/shared@3.4.38': - resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} + vue: 3.5.22 - '@vue/shared@3.5.12': - resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} - '@vueuse/core@10.11.1': - resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} - '@vueuse/core@11.1.0': - resolution: {integrity: sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==} + '@vueuse/core@13.9.0': + resolution: {integrity: sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==} + peerDependencies: + vue: ^3.5.0 - '@vueuse/integrations@11.1.0': - resolution: {integrity: sha512-O2ZgrAGPy0qAjpoI2YR3egNgyEqwG85fxfwmA9BshRIGjV4G6yu6CfOPpMHAOoCD+UfsIl7Vb1bXJ6ifrHYDDA==} + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} peerDependencies: async-validator: ^4 axios: ^1 @@ -3435,29 +4396,79 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@10.11.1': - resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/metadata@13.9.0': + resolution: {integrity: sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==} - '@vueuse/metadata@11.1.0': - resolution: {integrity: sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==} + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} - '@vueuse/shared@10.11.1': - resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + '@vueuse/shared@13.9.0': + resolution: {integrity: sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==} + peerDependencies: + vue: ^3.5.0 - '@vueuse/shared@11.1.0': - resolution: {integrity: sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + '@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==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + '@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==} abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -3471,41 +4482,34 @@ packages: peerDependencies: acorn: ^8 + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} - aggregate-error@5.0.0: resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} engines: {node: '>=18'} @@ -3518,6 +4522,14 @@ packages: ajv: optional: 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: @@ -3526,6 +4538,16 @@ packages: 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.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -3535,8 +4557,12 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - algoliasearch@4.24.0: - resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} + algoliasearch@5.40.0: + resolution: {integrity: sha512-a9aIL2E3Z7uYUPMCmjMFFd5MWhn+ccTubEvnMy7rOTZCB62dXBJtz0R5BZ/TPuX3R9ocBsgWuAbGWQ+Ph4Fmlg==} + engines: {node: '>= 14.0.0'} + + alien-signals@3.0.0: + resolution: {integrity: sha512-JHoRJf18Y6HN4/KZALr3iU+0vW9LKG+8FMThQlbn4+gv8utsLIkwpomjElGPccGeNwh0FI2HN6BLnyFLo6OyLQ==} ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -3553,22 +4579,30 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -3576,9 +4610,6 @@ packages: append-field@1.0.0: resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -3591,10 +4622,8 @@ packages: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -3602,39 +4631,27 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-flatten@3.0.0: - resolution: {integrity: sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.reduce@1.0.7: - resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - ast-kit@1.1.0: - resolution: {integrity: sha512-RlNqd4u6c/rJ5R+tN/ZTtyNrH8X0NHCvyt6gD8RHa3JjzxxHWoyaU0Ujk3Zjbh7IZqrYl1Sxm6XzZifmVxXxHQ==} - engines: {node: '>=16.14.0'} + ast-kit@2.1.3: + resolution: {integrity: sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==} + engines: {node: '>=20.19.0'} - ast-walker-scope@0.6.2: - resolution: {integrity: sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==} - engines: {node: '>=16.14.0'} + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + ast-walker-scope@0.8.3: + resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==} + engines: {node: '>=20.19.0'} async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} @@ -3645,72 +4662,95 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - auto-bind@5.0.1: - resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - autoprefixer@10.4.20: - resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + axe-core@4.10.3: + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + engines: {node: '>=4'} - aws-sdk@2.1682.0: - resolution: {integrity: sha512-Kh4nXRKvidlNXwKA8V4aoMW2F4UeCj9J4sumQxUQE6EpHlSsdCGZTPoGcMcKp/kAlS+iuJtuQIOP2aXZWdGczQ==} - engines: {node: '>= 10.0.0'} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - axe-core@4.10.0: - resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} - engines: {node: '>=4'} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + babel-jest@30.2.0: + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + + babel-plugin-istanbul@7.0.1: + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} + + babel-plugin-jest-hoist@30.2.0: + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + peerDependencies: + '@babel/core': ^7.0.0 || ^8.0.0-0 - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + babel-preset-jest@30.2.0: + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + bare-events@2.8.0: + resolution: {integrity: sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcrypt@5.1.1: - resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} - engines: {node: '>= 10.0.0'} + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} + hasBin: true + + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + bcrypt@6.0.0: + resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==} + engines: {node: '>= 18'} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} bin-links@4.0.4: resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - birpc@0.2.17: - resolution: {integrity: sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==} - - birpc@0.2.19: - resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3721,50 +4761,41 @@ packages: blueimp-canvas-to-blob@3.29.0: resolution: {integrity: sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==} - blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - body-parser@2.0.1: - resolution: {integrity: sha512-PagxbjvuPH6tv0f/kdVbFGcb79D236SLcDTs6DrQ7GizJ88S1UWP4nMXFEo/I4fdhGRGabvFfFjVGm3M7U8JwA==} - engines: {node: '>= 0.10'} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} boxen@8.0.1: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + browserslist@4.26.3: + resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -3779,25 +4810,15 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - - buffer@5.6.0: - resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builtin-modules@3.0.0: - resolution: {integrity: sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==} - engines: {node: '>=6'} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} + engines: {node: '>=18.20'} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -3811,24 +4832,8 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c12@1.11.1: - resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==} - peerDependencies: - magicast: ^0.3.4 - peerDependenciesMeta: - magicast: - optional: true - - c12@1.11.2: - resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} - peerDependencies: - magicast: ^0.3.4 - peerDependenciesMeta: - magicast: - optional: true - - c12@2.0.1: - resolution: {integrity: sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==} + c12@3.3.0: + resolution: {integrity: sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw==} peerDependencies: magicast: ^0.3.5 peerDependenciesMeta: @@ -3851,21 +4856,18 @@ packages: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + 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'} - camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - - camelcase-keys@7.0.2: - resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} - engines: {node: '>=12'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -3874,10 +4876,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -3885,71 +4883,73 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001653: - resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} + caniuse-lite@1.0.30001750: + resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} - caniuse-lite@1.0.30001679: - resolution: {integrity: sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==} + casual@1.6.2: + resolution: {integrity: sha512-NQObL800rg32KZ9bBajHbyDjxLXxxuShChQg7A4tbSeG3n1t7VYGOSkzFSI9gkSgOHp+xilEJ7G0L5l6M30KYA==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - cjs-module-lexer@1.4.0: - resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} - clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} + class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + class-validator@0.14.2: + resolution: {integrity: sha512-3kMVRF2io8N8pY1IFIXlho9r8IPUUIfHe2hYVtiebvAzU2XeQFXTv+XI4WX+TnXmtwXMDcjngcpkiPM0O9PvLw==} clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} @@ -3959,25 +4959,14 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} - - clean-stack@5.2.0: - resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} + clean-stack@5.3.0: + resolution: {integrity: sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==} engines: {node: '>=14.16'} - clear@0.1.0: - resolution: {integrity: sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==} - cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} - engines: {node: '>=0.10'} - cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -3990,6 +4979,14 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-spinners@3.3.0: + resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} + engines: {node: '>=18.20'} + + 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'} @@ -3998,11 +4995,9 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + clipboardy@5.0.0: + resolution: {integrity: sha512-MQfKHaD09eP80Pev4qBxZLbxJK/ONnqfSYAPlCmPh+7BDboYtO/3BmB6HGzxDIT0SlTRc2tzS8lQqfcdLtZ0Kg==} + engines: {node: '>=20'} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -4023,28 +5018,28 @@ packages: resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -4060,20 +5055,24 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + comment-json@4.4.1: + resolution: {integrity: sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==} + engines: {node: '>= 6'} comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} @@ -4082,11 +5081,18 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compatx@0.1.8: - resolution: {integrity: sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==} + compatx@0.2.0: + resolution: {integrity: sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} @@ -4095,191 +5101,28 @@ packages: compressorjs@1.2.1: resolution: {integrity: sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ==} - computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} - concurrently@9.1.0: - resolution: {integrity: sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} engines: {node: '>=18'} hasBin: true - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - consolidate@1.0.4: - resolution: {integrity: sha512-RuZ3xnqEDsxiwaoIkqVeeK3gg9qxw7+YKYX2tKhLs1eukVKMgSr4VYI3iYFsRHi4TloHYDlugrz3kvkjs3nynA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.22.5 - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - mote: ^0.2.0 - mustache: ^4.0.1 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - react: '>=16.13.1' - react-dom: '>=16.13.1' - slm: ^2.0.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - '@babel/core': - optional: true - arc-templates: - optional: true - atpl: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -4298,6 +5141,9 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + cookie-parser@1.4.7: resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} engines: {node: '>= 0.8.0'} @@ -4305,27 +5151,27 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - - cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - core-js-compat@3.38.1: - resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -4358,40 +5204,36 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - croner@9.0.0: - resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} + croner@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} - cronstrue@2.50.0: - resolution: {integrity: sha512-ULYhWIonJzlScCCQrPUG5uMXzXxSixty4djud9SS37DoNxDdkeRocxzHuAo4ImRBUK+mAuU5X9TSwEDccnnuPg==} - hasBin: true - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.1: - resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - css-declaration-sorter@7.2.0: - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + css-declaration-sorter@7.3.0: + resolution: {integrity: sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} cssesc@3.0.0: @@ -4399,77 +5241,68 @@ packages: engines: {node: '>=4'} hasBin: true - cssnano-preset-default@7.0.6: - resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} + cssnano-preset-default@7.0.9: + resolution: {integrity: sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - cssnano-utils@5.0.0: - resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + cssnano-utils@5.0.1: + resolution: {integrity: sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - cssnano@7.0.6: - resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} + cssnano@7.1.1: + resolution: {integrity: sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} + cssstyle@5.3.1: + resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} + engines: {node: '>=20'} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - db0@0.2.1: - resolution: {integrity: sha512-BWSFmLaCkfyqbSEZBQINMVNjCVfrogi7GQ2RSy1tmtfK9OXlsup6lUMwLsqSD7FbAjD04eWFdXowSHHUp6SE/Q==} + db0@0.3.4: + resolution: {integrity: sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw==} peerDependencies: '@electric-sql/pglite': '*' '@libsql/client': '*' better-sqlite3: '*' drizzle-orm: '*' mysql2: '*' + sqlite3: '*' peerDependenciesMeta: '@electric-sql/pglite': optional: true @@ -4481,36 +5314,11 @@ packages: optional: true mysql2: optional: true - - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + sqlite3: optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4518,8 +5326,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -4527,33 +5335,25 @@ packages: supports-color: optional: true - debuglog@1.0.1: - resolution: {integrity: sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decamelize@5.0.1: - resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} - engines: {node: '>=10'} - - decamelize@6.0.0: - resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + decamelize@6.0.1: + resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -4576,10 +5376,6 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -4588,29 +5384,17 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - del-cli@5.1.0: - resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} - engines: {node: '>=14.16'} - hasBin: true - - del@7.1.0: - resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} - engines: {node: '>=14.16'} + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -4623,27 +5407,28 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} hasBin: true - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} - devalue@5.1.1: - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -4651,113 +5436,87 @@ packages: dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - domhandler@3.3.0: - resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} - engines: {node: '>= 4'} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - - dot-prop@9.0.0: - resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} - engines: {node: '>=18'} + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} - dotenv-cli@7.4.2: - resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==} + dotenv-cli@10.0.0: + resolution: {integrity: sha512-lnOnttzfrzkRx2echxJHQRB6vOAMSCzzZg79IxpC00tU42wZPuZkQxNNrrwVAxaQZIIh001l4PxVlCrBxngBzA==} hasBin: true - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv-expand@12.0.1: + resolution: {integrity: sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dottie@2.0.6: - resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} - - electron-to-chromium@1.5.55: - resolution: {integrity: sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==} - - email-validator@2.0.4: - resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} - engines: {node: '>4.0'} - - emailjs@4.0.3: - resolution: {integrity: sha512-1CDXoE3FxkSg7QRTlLsDCYG9elFNu/JQsYWu3Xfrk77ubbg5zYgFGg+JRUKQJ56mceM8o3rHHX0VB4wo9XsyLQ==} - engines: {node: '>=12'} - peerDependencies: - typescript: '>=4.3.5' - peerDependenciesMeta: - typescript: - optional: true + electron-to-chromium@1.5.234: + resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4765,10 +5524,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -4776,20 +5531,21 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -4797,86 +5553,48 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - error-stack-parser-es@0.1.5: - resolution: {integrity: sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} errx@0.1.0: resolution: {integrity: sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-symbol@3.1.4: - resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} - engines: {node: '>=0.12'} - - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-goat@3.0.0: - resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} - engines: {node: '>=10'} - escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -4887,6 +5605,10 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -4895,65 +5617,112 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-flat-gitignore@0.3.0: - resolution: {integrity: sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==} + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-flat-gitignore@2.1.0: + resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==} peerDependencies: eslint: ^9.5.0 - eslint-flat-config-utils@0.4.0: - resolution: {integrity: sha512-kfd5kQZC+BMO0YwTol6zxjKX1zAsk8JfSAopbKjKqmENTJcew+yBejuvccAg37cvOrN0Mh+DVbeyznuNWEjt4A==} + eslint-flat-config-utils@2.1.4: + resolution: {integrity: sha512-bEnmU5gqzS+4O+id9vrbP43vByjF+8KOs+QuuV4OlqAuXmnRW2zfI/Rza1fQvdihQ5h4DUo0NqFAiViD4mSrzQ==} + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + + eslint-merge-processors@2.0.0: + resolution: {integrity: sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==} + peerDependencies: + eslint: '*' - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-plugin-import-lite@0.3.0: + resolution: {integrity: sha512-dkNBAL6jcoCsXZsQ/Tt2yXmMDoNt5NaBh/U7yvccjiK8cai6Ay+MK77bMykmqQA2bTF6lngaLCDij6MTO3KkvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + typescript: '>=4.5' + peerDependenciesMeta: + typescript: + optional: true - eslint-plugin-import-x@4.4.0: - resolution: {integrity: sha512-me58aWTjdkPtgmOzPe+uP0bebpN5etH4bJRnYzy85Rn9g/3QyASg6kTCqdwNzyaJRqMI2ii2o8s01P2LZpREHg==} + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: + '@typescript-eslint/utils': ^8.0.0 eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true - eslint-plugin-jsdoc@50.4.3: - resolution: {integrity: sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA==} - engines: {node: '>=18'} + eslint-plugin-jsdoc@54.7.0: + resolution: {integrity: sha512-u5Na4he2+6kY1rWqxzbQaAwJL3/tDCuT5ElDRc5UJ9stOeQeQ5L1JJ1kRRu7ldYMlOHMCJLsY8Mg/Tu3ExdZiQ==} + engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-regexp@2.6.0: - resolution: {integrity: sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A==} + eslint-plugin-regexp@2.10.0: + resolution: {integrity: sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng==} engines: {node: ^18 || >=20} peerDependencies: eslint: '>=8.44.0' - eslint-plugin-unicorn@56.0.0: - resolution: {integrity: sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==} - engines: {node: '>=18.18'} + eslint-plugin-unicorn@60.0.0: + resolution: {integrity: sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==} + engines: {node: ^20.10.0 || >=21.0.0} + peerDependencies: + eslint: '>=9.29.0' + + eslint-plugin-vue@10.5.0: + resolution: {integrity: sha512-7BZHsG3kC2vei8F2W8hnfDi9RK+cv5eKPMvzBdrl8Vuc0hR5odGQRli8VVzUkrmUHkxFEm4Iio1r5HOKslO0Aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=8.56.0' + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true - eslint-plugin-vue@9.30.0: - resolution: {integrity: sha512-CyqlRgShvljFkOeYK8wN5frh/OGTvkj1S7wlr2Q2pUvwq+X5VYiLd6ZjujpgSgLnys2W8qrBLkXQ41SUYaoPIQ==} - engines: {node: ^14.17.0 || >=16.0.0} + eslint-processor-vue-blocks@2.0.0: + resolution: {integrity: sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==} peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@vue/compiler-sfc': ^3.3.0 + eslint: '>=9.0.0' - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.14.0: - resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} + eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4962,18 +5731,14 @@ packages: jiti: optional: true - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -4987,6 +5752,10 @@ packages: 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'} @@ -5005,16 +5774,12 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - events@1.1.1: - resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} - engines: {node: '>=0.4.x'} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -5028,44 +5793,31 @@ packages: resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.5.1: - resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==} + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} engines: {node: ^18.19.0 || >=20.5.0} - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - - express-rate-limit@7.4.1: - resolution: {integrity: sha512-KS3efpnpIDVIXopMc65EMbWbUht7qvTCdtCR2dD/IZmi9MIkopYESwyRqLgv8Pfu589+KqDqOdzJWW7AHoACeg==} - engines: {node: '>= 16'} - peerDependencies: - express: 4 || 5 || ^5.0.0-beta.1 - - express-session@1.18.1: - resolution: {integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} - express@5.0.0: - resolution: {integrity: sha512-V4UkHQc+B7ldh1YC84HCXHwf60M4BOMvp9rkvTUWCK5apqDC1Esnbid4wm6nFyVuDy8XMfETsJw5lsIGBWyo0A==} - engines: {node: '>= 18'} + expect@30.2.0: + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} - externality@1.0.2: - resolution: {integrity: sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -5081,8 +5833,8 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -5091,39 +5843,31 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-npm-meta@0.2.2: - resolution: {integrity: sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==} - - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} + fast-npm-meta@0.4.7: + resolution: {integrity: sha512-aZU3i3eRcSb2NCq8i6N6IlyiTyF6vqAqzBGl2NBF6ngNx/GIqfYbkLDIKZ4z4P0o/RmtsFnVqHwdrSm13o4tnQ==} fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.0: - resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5133,6 +5877,18 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + figlet@1.9.3: + resolution: {integrity: sha512-majPgOpVtrZN1iyNGbsUP6bOtZ6eaJgg5HHh0vFvm5DJhh8dc+FJpOC4GABvMZ/A7XHAJUuJujhgUY/2jPWgMA==} + engines: {node: '>= 17.0.0'} + hasBin: true + figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} @@ -5141,6 +5897,10 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-type@21.0.0: + resolution: {integrity: sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==} + engines: {node: '>=20'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -5148,12 +5908,12 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@2.0.0: - resolution: {integrity: sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} engines: {node: '>= 0.8'} - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} find-up@4.1.0: @@ -5176,14 +5936,14 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - focus-trap@7.6.0: - resolution: {integrity: sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==} + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -5191,23 +5951,31 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data-encoder@1.7.2: - resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + 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 - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} - formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -5216,29 +5984,18 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-blob-store@6.0.0: - resolution: {integrity: sha512-oMdboCaw6kTRXi5lKfjpw7DO7maC+gwFmaef3DsYQTYHtOoTmCo13ZGH1GoqFaD81RW5qbaT9YKlP+OA4dzbdA==} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -5247,6 +6004,9 @@ packages: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs-monkey@1.1.0: + resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5263,17 +6023,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} - deprecated: This package is no longer supported. gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -5283,16 +6035,24 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} @@ -5310,26 +6070,25 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-tsconfig@4.12.0: + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} - get-tsconfig@4.7.6: - resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} - giget@1.2.3: - resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} - hasBin: true + getopts@2.3.0: + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - git-config-path@2.0.0: - resolution: {integrity: sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==} - engines: {node: '>=4'} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true - git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + git-up@8.1.1: + resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} - git-url-parse@15.0.0: - resolution: {integrity: sha512-5reeBufLi+i4QD3ZFftcJs9jC26aULFLBU23FeKM/b1rI0K6ofIeAblmDVO7Ht22zTDE9+CkJ3ZVb0CgJmz3UQ==} + git-url-parse@16.1.0: + resolution: {integrity: sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -5339,10 +6098,18 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -5351,46 +6118,31 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.12.0: - resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - globby@14.0.2: - resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} - engines: {node: '>=18'} + globby@15.0.0: + resolution: {integrity: sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==} + engines: {node: '>=20'} - google-fonts-helper@3.6.0: - resolution: {integrity: sha512-ReantWd/l8dedKqTYjvqaQ55rAl/rbRqWL5VXHNXtGwIhMX4N8VNA7V19drr7xiv5G3pzlYID0K4FauvGqnWEg==} + google-fonts-helper@3.7.3: + resolution: {integrity: sha512-dENZeK6RMvkCOFoKbLbS+pyoDgpmk4U6BYmfXnztMar2d8SjEG6valxql/Lkyi7bu5F+3FTdE+gAEYSYZ5zzMA==} google-protobuf@3.21.4: resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} @@ -5402,58 +6154,34 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gravatar@1.8.2: - resolution: {integrity: sha512-GdRwLM3oYpFQKy47MKuluw9hZ2gaCtiKPbDGdcDEuYDKlc8eNnW27KYL9LVbIDzEsx88WtDWQm2ClBcsgBnj6w==} - engines: {node: '>=10'} - hasBin: true + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} gzip-size@7.0.0: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - h3@1.13.0: - resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + h3@1.15.4: + resolution: {integrity: sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - hash-obj@4.0.0: - resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} - engines: {node: '>=12'} - - hash-sum@2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - hashids@2.3.0: resolution: {integrity: sha512-ljM73TE/avEhNnazxaj0Dw3BbEUuLC5yYCQ9RSkSUcT4ZSU6ZebdKCIBJ+xT/DnSYW36E9k82GH1Q6MydSIosQ==} @@ -5461,19 +6189,15 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-to-html@9.0.3: - resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - helmet@7.1.0: - resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} - engines: {node: '>=16.0.0'} + helmet@8.1.0: + resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} + engines: {node: '>=18.0.0'} help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} @@ -5481,13 +6205,6 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5496,33 +6213,14 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} - html-minifier@4.0.0: - resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} - engines: {node: '>=6'} - hasBin: true - - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - - html-to-text@9.0.5: - resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} - engines: {node: '>=14'} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - htmlparser2@5.0.1: - resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} - - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - - htmlparser2@9.1.0: - resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -5536,23 +6234,16 @@ packages: resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - http-status-codes@2.3.0: - resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} - http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - httpxy@0.1.5: - resolution: {integrity: sha512-hqLDO+rfststuyEUTWObQK6zHEEmZ/kaIP2/zclGGZn6X8h/ESTWg+WKecQ/e5k4nPswjzZD+q2VqZIbr15CoQ==} + httpxy@0.1.7: + resolution: {integrity: sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==} human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -5562,46 +6253,29 @@ packages: resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} engines: {node: '>=12.20.0'} - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - human-signals@8.0.0: - resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - humanize-string@3.0.0: - resolution: {integrity: sha512-jhWD2GAZRMELz0IEIfqpEdi0M4CMQF1GpJpBYIopFN6wT+78STiujfQTKcKqZzOJgUkIgJSo2xFeHdsg922JZQ==} + humanize-string@3.1.0: + resolution: {integrity: sha512-wEtOOR3sT8nZ7W0WZwEXo68z2EA0kpcpjaN/ZXxpps9PDzZdX8+TAj+XOGKx2WkagP9mnhWtFpfMNSd2WAhiIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.5.2: - resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ieee754@1.1.13: - resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - ignore-walk@6.0.5: resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5610,35 +6284,40 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@6.0.2: - resolution: {integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - image-meta@0.2.1: - resolution: {integrity: sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==} + image-meta@0.2.2: + resolution: {integrity: sha512-3MOLanc3sb3LNGWQl1RlQlNWURE5g32aUphrDyFeCsxBTk08iE3VNe4CwsUZ0Qs1X+EfX0+r29Sxdpza4B+yRA==} - image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + image-size@1.2.1: + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} engines: {node: '>=16.x'} hasBin: true - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.11.0: - resolution: {integrity: sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==} + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + impound@1.0.0: + resolution: {integrity: sha512-8lAJ+1Arw2sMaZ9HE2ZmL5zOcMnt18s6+7Xqgq2aUVy4P1nlzAyPtzCDxsk51KVFwHEEdc6OWvUyqwHwhRYaug==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -5651,14 +6330,6 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@0.1.2: - resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} - engines: {node: '>=18'} - - inflection@1.13.4: - resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} - engines: {'0': node >= 0.4.0} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -5666,9 +6337,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@2.0.0: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} @@ -5681,24 +6349,25 @@ packages: resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@9.3.6: - resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} + inquirer@12.9.6: + resolution: {integrity: sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} - ioredis@5.4.1: - resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + ioredis@5.8.1: + resolution: {integrity: sha512-Qho8TgIamqEPdgiMadJwzRMW3TudIg6vpg4YONokGDudy4eqRIJtDbVX72pfLBcWxvbn3qm/40TyGUObdW4tLQ==} engines: {node: '>=12.22.0'} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -5708,50 +6377,19 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-blob@2.1.0: resolution: {integrity: sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==} engines: {node: '>=6'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} + engines: {node: '>=18.20'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-docker@2.2.1: @@ -5772,9 +6410,9 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -5806,34 +6444,14 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - - is-path-cwd@3.0.0: - resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -5841,25 +6459,14 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + is-ssh@1.4.1: + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} @@ -5873,32 +6480,17 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-wayland@0.1.0: + resolution: {integrity: sha512-QkbMsWkIfkrzOPxenwye0h56iAXirZYHG9eHVPb22fO9y+wPbaX/CHacOWBa/I++4ohTcByimhM1/nyCsH8KNA==} + engines: {node: '>=20'} is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} @@ -5919,9 +6511,6 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -5929,52 +6518,192 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + jest-changed-files@30.2.0: + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.2.0: + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.2.0: + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.2.0: + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@types/node': '*' + esbuild-register: '>=3.4.0' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + esbuild-register: + optional: true + ts-node: + optional: true + + jest-diff@30.2.0: + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.2.0: + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.2.0: + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-environment-node@30.2.0: + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-haste-map@30.2.0: + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.2.0: + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.2.0: + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@30.2.0: + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-mock@30.2.0: + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.2.0: + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.2.0: + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.2.0: + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.2.0: + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.2.0: + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-util@30.2.0: + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-validate@30.2.0: + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.2.0: + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@30.2.0: + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.2.0: + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true - jiti@2.4.0: - resolution: {integrity: sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - jmespath@0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} - - joi@17.13.3: - resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - - jose@4.15.9: - resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + joi@18.0.1: + resolution: {integrity: sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==} + engines: {node: '>= 20'} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true - - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - - js-levenshtein@1.1.6: - resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} - engines: {node: '>=0.10.0'} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} @@ -5984,36 +6713,33 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdoc-type-pratt-parser@4.8.0: + resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} + engines: {node: '>=12.0.0'} - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + jsdoc-type-pratt-parser@5.1.1: + resolution: {integrity: sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==} engines: {node: '>=12.0.0'} - jsdom@24.1.3: - resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} - engines: {node: '>=18'} + jsdom@27.0.0: + resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} + engines: {node: '>=20'} peerDependencies: - canvas: ^2.11.2 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -6041,36 +6767,32 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - - juice@10.0.1: - resolution: {integrity: sha512-ZhJT1soxJCkOiO55/mz8yeBKTAJhRzX9WBO+16ZTqNTONnnVlUPyVBIzQ7lDRjaBdTbid+bAnyIon/GM3yp4cA==} - engines: {node: '>=10.0.0'} - hasBin: true - just-diff-apply@5.5.0: resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} just-diff@6.0.2: resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} @@ -6078,58 +6800,79 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.1.3: - resolution: {integrity: sha512-qWefZgq3GByWFTQgn+C9U7iaHe+mwAVb1utqbna15ggTO5RiLSL91NY+5liTgzchAhGhI6MOn5NVVn/eR1FkPA==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - knitwork@1.1.0: - resolution: {integrity: sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==} - - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + knex@3.1.0: + resolution: {integrity: sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + better-sqlite3: '*' + mysql: '*' + mysql2: '*' + pg: '*' + pg-native: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true - launch-editor@2.8.1: - resolution: {integrity: sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==} + knitwork@1.2.0: + resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} - launch-editor@2.9.1: - resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} + launch-editor@2.11.1: + resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} - leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + libphonenumber-js@1.12.24: + resolution: {integrity: sha512-l5IlyL9AONj4voSd7q9xkuQOL4u8Ty44puTic7J88CmdXkxfGsRfoVLXHCxppwehgpb/Chdb80FFehHqjN3ItQ==} + + libsql@0.5.22: + resolution: {integrity: sha512-NscWthMQt7fpU8lqd7LXMvT9pi+KhhmTHAJWUB/Lj6MWa0MKFv0F2V4C6WKKpjCVZl0VwcDz4nOI3CyaT1DDiA==} + cpu: [x64, arm64, wasm32, arm] + os: [darwin, linux, win32] - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -6137,8 +6880,16 @@ packages: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + load-esm@1.0.2: + resolution: {integrity: sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==} + engines: {node: '>=13.2.0'} + + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} locate-path@5.0.0: @@ -6168,9 +6919,6 @@ packages: lodash.isboolean@3.0.3: resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - lodash.isinteger@4.0.4: resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} @@ -6202,15 +6950,12 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} - long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - - lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} @@ -6219,6 +6964,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -6226,31 +6975,24 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} - engines: {node: '>=12'} - - magic-string-ast@0.6.2: - resolution: {integrity: sha512-oN3Bcd7ZVt+0VGEs7402qR/tjgjbM7kPlH/z7ufJnzTLVBzXJITRHOJiwMmmYMgZfdoWQsfQcY+iKlxiBppnMA==} - engines: {node: '>=16.14.0'} + magic-regexp@0.10.0: + resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magicast@0.3.4: - resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - mailtrap@3.4.0: - resolution: {integrity: sha512-gegg90/gMY8hvfxB+WMtE8RRZyhQr90jUw00QOLApIAomItumqFBCpZv5IfG51EUKThu9+p7X4QdNA4buryenw==} + mailtrap@4.3.0: + resolution: {integrity: sha512-JqWpt11LONtxmfMGf3EB5mrKLAapHajSdnVKxWD0b4/Boak9GEosAvVpnkiSTJJuB7dgLeLDVUeOwqDssXl8pA==} engines: {node: '>=16.20.1', yarn: '>=1.22.17'} peerDependencies: '@types/nodemailer': ^6.4.9 @@ -6261,21 +7003,19 @@ packages: nodemailer: optional: true - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} make-fetch-happen@13.0.1: resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} engines: {node: ^16.14.0 || >=18.0.0} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} @@ -6284,14 +7024,27 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + massimo-cli@1.0.1: + resolution: {integrity: sha512-Z9SWuG8FKa+AiOMyTby48MlZ8PwrYjYR4zV50C3te7at2Am6oJAwBW7iKTk4hO6DliG0DYU7LrF+FWxxa2+wqA==} + engines: {node: '>=22.18.0'} + hasBin: true + + massimo@1.0.1: + resolution: {integrity: sha512-DIiGuCBIpZZXI78LKLi66n9zoaterfOtje7vPt4X/XFMntg+5sXjSt1u1xTH3EnR5dPuxsbar7D6wyIf4Eyt2A==} + engines: {node: '>=22.18.0'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -6304,16 +7057,9 @@ packages: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - memoizee@0.4.17: - resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} - engines: {node: '>=0.12'} - - mensch@0.3.4: - resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} - - meow@10.1.5: - resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + 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==} @@ -6326,50 +7072,52 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mersenne-twister@1.1.0: + resolution: {integrity: sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - micromark-util-character@2.1.0: - resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mikro-orm@6.5.8: + resolution: {integrity: sha512-N3iZIOX/1OHP5c9LSJ6P8MN+Ri+Ab7Clo9U/vKg/7paAdTPgBioMcWzRjimoWMPj8COZYEn9x/xPnlna3FHVEg==} + engines: {node: '>= 18.12.0'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + 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.0: - resolution: {integrity: sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==} + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} @@ -6380,8 +7128,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mime@4.0.4: - resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==} + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} engines: {node: '>=16'} hasBin: true @@ -6405,9 +7153,9 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -6416,22 +7164,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -6439,145 +7175,47 @@ packages: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} - minipass-fetch@3.0.5: - resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minisearch@7.1.0: - resolution: {integrity: sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - mjml-accordion@4.15.3: - resolution: {integrity: sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==} - - mjml-body@4.15.3: - resolution: {integrity: sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==} - - mjml-button@4.15.3: - resolution: {integrity: sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==} - - mjml-carousel@4.15.3: - resolution: {integrity: sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==} - - mjml-cli@4.15.3: - resolution: {integrity: sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==} - hasBin: true - - mjml-column@4.15.3: - resolution: {integrity: sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==} - - mjml-core@4.15.3: - resolution: {integrity: sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==} - - mjml-divider@4.15.3: - resolution: {integrity: sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==} - - mjml-group@4.15.3: - resolution: {integrity: sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==} - - mjml-head-attributes@4.15.3: - resolution: {integrity: sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==} - - mjml-head-breakpoint@4.15.3: - resolution: {integrity: sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==} - - mjml-head-font@4.15.3: - resolution: {integrity: sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==} - - mjml-head-html-attributes@4.15.3: - resolution: {integrity: sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==} - - mjml-head-preview@4.15.3: - resolution: {integrity: sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==} - - mjml-head-style@4.15.3: - resolution: {integrity: sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==} - - mjml-head-title@4.15.3: - resolution: {integrity: sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==} - - mjml-head@4.15.3: - resolution: {integrity: sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==} - - mjml-hero@4.15.3: - resolution: {integrity: sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==} - - mjml-image@4.15.3: - resolution: {integrity: sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==} - - mjml-migrate@4.15.3: - resolution: {integrity: sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==} - hasBin: true - - mjml-navbar@4.15.3: - resolution: {integrity: sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==} - - mjml-parser-xml@4.15.3: - resolution: {integrity: sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==} - - mjml-preset-core@4.15.3: - resolution: {integrity: sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==} + minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mjml-raw@4.15.3: - resolution: {integrity: sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==} + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} - mjml-section@4.15.3: - resolution: {integrity: sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==} + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} - mjml-social@4.15.3: - resolution: {integrity: sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==} + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} - mjml-spacer@4.15.3: - resolution: {integrity: sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} - mjml-table@4.15.3: - resolution: {integrity: sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==} + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} - mjml-text@4.15.3: - resolution: {integrity: sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} - mjml-validator@4.15.3: - resolution: {integrity: sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==} + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - mjml-wrapper@4.15.3: - resolution: {integrity: sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} - mjml@4.15.3: - resolution: {integrity: sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==} - hasBin: true + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -6588,37 +7226,22 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - - mlly@1.7.2: - resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} - module-details-from-path@1.0.3: - resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + mocked-exports@0.1.1: + resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} - moment-timezone@0.5.45: - resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -6628,45 +7251,62 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - multer@1.4.5-lts.1: - resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==} - engines: {node: '>= 6.0.0'} - - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true + multer@2.0.2: + resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + engines: {node: '>= 10.16.0'} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.0.7: - resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} engines: {node: ^18 || >=20} hasBin: true + nanotar@0.2.0: + resolution: {integrity: sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==} + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} negotiator@1.0.0: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nestjs-pino@4.4.1: + resolution: {integrity: sha512-/E/JOtsUf/yHFGJx+zxBfwjCn1uJVV9AxSyx/mD0oNFCP+psvv9XE7WGh5Cebo6TwukF4qEu37eissGErVwLVg==} + engines: {node: '>= 14'} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + pino: ^7.5.0 || ^8.0.0 || ^9.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + rxjs: ^7.1.0 + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} - nitropack@2.10.3: - resolution: {integrity: sha512-7n+ITF7RbCMwZZzyacxJ9eMCnWuE60omGJEyLM5PQRKS4Vu5w6OOCvf4C6E3UC0UryFuUIwGbJ3M+tIP9Az9OQ==} - engines: {node: ^16.11.0 || >=17.0.0} + nitropack@2.12.7: + resolution: {integrity: sha512-HWyzMBj2d8b14J6Cfnxv97ztnuHIgXNcrGiWCruLfb2ZfKsp6OCbZYJm5T9sv/ZKl8LedhatrMKG66HWJux9Rg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: xml2js: ^0.6.2 @@ -6674,21 +7314,30 @@ packages: xml2js: optional: true - no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + node-abi@3.78.0: + resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==} + engines: {node: '>=10'} - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-addon-api@8.5.0: + resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} + engines: {node: ^18 || ^20 || >= 21} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -6699,43 +7348,45 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-gyp@10.2.0: - resolution: {integrity: sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==} + node-gyp@10.3.1: + resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} engines: {node: ^16.14.0 || >=18.0.0} hasBin: true - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - nodemon@3.1.7: - resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} - engines: {node: '>=10'} - hasBin: true + node-mock-http@1.0.3: + resolution: {integrity: sha512-jN8dK25fsfnMrVsEhluUTPkBFY+6ybu7jSB1n+ri/vOGjJxU8J9CZhpSGkHXSkFjtUhbmoncG/YG9ta5Ludqog==} - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + node-releases@2.0.23: + resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} + + nodemailer@7.0.9: + resolution: {integrity: sha512-9/Qm0qXIByEP8lEV2qOqcAW7bRpL8CR9jcTwk3NBnHJNmP9fIJ86g2fgmIXqHY+nj55ZEMwWqYAT2QTDpRUYiQ==} + engines: {node: '>=6.0.0'} nopt@7.2.1: resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} @@ -6761,9 +7412,6 @@ packages: resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - npm-normalize-package-bin@1.0.1: - resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} - npm-normalize-package-bin@3.0.1: resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6796,41 +7444,24 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nuxi@3.15.0: - resolution: {integrity: sha512-ZVu45nuDrdb7nzKW2kLGY/N1vvFYLLbUVX6gUYw4BApKGGu4+GktTR5o48dGVgMYX9A8chaugl7TL9ZYmwC9Mg==} - engines: {node: ^16.10.0 || >=18.0.0} - hasBin: true - - nuxt@3.13.0: - resolution: {integrity: sha512-NZlPGlMav18KXWiOmTguQtH5lcrwooPniWXM3Ca4c9spsMRu3wyWLlN8wiI/cK+lEu3rQyKCGSA75nFVK4Ew3w==} - engines: {node: ^14.18.0 || >=16.10.0} + nuxt@4.1.2: + resolution: {integrity: sha512-g5mwszCZT4ZeGJm83nxoZvtvZoAEaY65VDdn7p7UgznePbRaEJJ1KS1OIld4FPVkoDZ8TEVuDNqI9gUn12Exvg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@parcel/watcher': ^2.1.0 - '@types/node': ^14.18.0 || >=16.10.0 + '@types/node': '>=18.12.0' peerDependenciesMeta: '@parcel/watcher': optional: true '@types/node': optional: true - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} - - nypm@0.3.11: - resolution: {integrity: sha512-E5GqaAYSnbb6n1qZyik2wjPDZON43FqOJO59+3OkWrnmQtjggrMOVnsyzfjxp/tS6nlYJBA4zRA5jSM2YaadMg==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - - nypm@0.3.12: - resolution: {integrity: sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==} + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -6838,41 +7469,19 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} - - ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} - ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} - ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - ohash@1.1.4: - resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} - - oidc-token-hash@5.0.3: - resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} - engines: {node: ^10.13.0 || >=12.0.0} + on-change@5.0.1: + resolution: {integrity: sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==} + engines: {node: '>=18'} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} @@ -6882,10 +7491,6 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -6901,35 +7506,17 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} - oniguruma-to-js@0.4.3: - resolution: {integrity: sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} - open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - openai@4.71.1: - resolution: {integrity: sha512-C6JNMaQ1eijM0lrjiRUL3MgThVP5RdwNAghpbJFdW0t11LzmyqON8Eh8MuUuEZ+CeD6bgYl2Fkn2BoptVxv9Ug==} - hasBin: true - peerDependencies: - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - - openapi-typescript@7.4.2: - resolution: {integrity: sha512-SvhmSTItcEAdDUcz+wzrcg6OENpMRkHqqY2hZB01FT+NOfgLcZ1B1ML6vcQrnipONHtG9AQELiKHgGTjpNGjiQ==} - hasBin: true - peerDependencies: - typescript: ^5.x - - openid-client@5.7.0: - resolution: {integrity: sha512-4GCCGZt1i2kTHpwvaC/sCpTpQqDnBzDzuJcJMbH+y1Q5qI8U8RBvoSh28svarXszZHR5BAMXbJPX1PGPRE3VOA==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -6938,16 +7525,29 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - ora@8.1.1: - resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} - engines: {node: '>=18'} + ora@9.0.0: + resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + engines: {node: '>=20'} orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + oxc-minify@0.87.0: + resolution: {integrity: sha512-+UHWp6+0mdq0S2rEsZx9mqgL6JnG9ogO+CU17XccVrPUFtISFcZzk/biTn1JdBYFQ3kztof19pv8blMtgStQ2g==} + engines: {node: '>=14.0.0'} + + oxc-parser@0.87.0: + resolution: {integrity: sha512-uc47XrtHwkBoES4HFgwgfH9sqwAtJXgAIBq4fFBMZ4hWmgVZoExyn+L4g4VuaecVKXkz1bvlaHcfwHAJPQb5Gw==} + engines: {node: '>=20.0.0'} + + oxc-transform@0.87.0: + resolution: {integrity: sha512-dt6INKWY2DKbSc8yR9VQoqBsCjPQ3z/SKv882UqlwFve+K38xtpi2avDlvNd35SpHUwDLDFoV3hMX0U3qOSaaQ==} + engines: {node: '>=14.0.0'} + + oxc-walker@0.5.2: + resolution: {integrity: sha512-XYoZqWwApSKUmSDEFeOKdy3Cdh95cOcSU8f7yskFWE4Rl3cfL5uwyY+EV7Brk9mdNLy+t5SseJajd6g7KncvlA==} + peerDependencies: + oxc-parser: '>=0.72.0' p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} @@ -6981,84 +7581,75 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} - engines: {node: '>=12'} - - p-min-delay@4.0.2: - resolution: {integrity: sha512-7hJcTq/MGF5pNHbQ2akrpPy1N43YYlB4RPECDSbPRn4xP/dsgP0I6ls7NvSUQ5k88o+CyATMOrQiZ/PK4aQR9w==} + p-min-delay@4.2.0: + resolution: {integrity: sha512-VMj+bb3VIP9W4S5YHHqKLJlJv8M+qsrvMpbvZB8mk/DNhBGJhFW1rKpF2t+9cRPUzriplRKecIbdWiWjpKaDCw==} engines: {node: '>=12'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.4.0: + resolution: {integrity: sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw==} - package-manager-detector@0.2.2: - resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==} + package-up@5.0.0: + resolution: {integrity: sha512-MQEgDUvXCa3sGvqHg3pzHO8e9gqTCMPVrWUko3vPQGntwegmFo52mZb2abIVTjFnUcW0BcPz0D93jV5Cas1DWA==} + engines: {node: '>=18'} pacote@18.0.6: resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} engines: {node: ^16.14.0 || >=18.0.0} hasBin: true - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parent-require@1.0.0: + resolution: {integrity: sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==} + engines: {node: '>= 0.4.0'} + parse-conflict-json@3.0.1: resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - parse-git-config@3.0.0: - resolution: {integrity: sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==} - engines: {node: '>=8'} - - parse-imports@2.1.1: - resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} - engines: {node: '>= 18'} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} - - parse-json@8.1.0: - resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} - engines: {node: '>=18'} - parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} - parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-path@7.1.0: + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} - parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - parseley@0.12.1: - resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -7075,8 +7666,8 @@ packages: resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} engines: {node: '>= 0.4.0'} - passport@0.6.0: - resolution: {integrity: sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==} + passport@0.7.0: + resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} engines: {node: '>= 0.4.0'} path-browserify@1.0.1: @@ -7109,71 +7700,74 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.1.0: - resolution: {integrity: sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} engines: {node: '>=16'} + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} - peberminta@0.9.0: - resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - pg-cloudflare@1.1.1: - resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} - pg-connection-string@2.7.0: - resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} + pg-cloudflare@1.2.7: + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} - pg-cursor@2.12.1: - resolution: {integrity: sha512-V13tEaA9Oq1w+V6Q3UBIB/blxJrwbbr35/dY54r/86soBJ7xkP236bXaORUTVXUPt9B6Ql2BQu+uwQiuMfRVgg==} - peerDependencies: - pg: ^8 + pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + pg-connection-string@2.9.1: + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.7.0: - resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} + pg-pool@3.10.1: + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} peerDependencies: pg: '>=8.0' - pg-protocol@1.7.0: - resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==} - - pg-query-stream@4.7.1: - resolution: {integrity: sha512-UMgsgn/pOIYsIifRySp59vwlpTpLADMK9HWJtq5ff0Z3MxBnPMGnCQeaQl5VuL+7ov4F96mSzIRIcz+Duo6OiQ==} - peerDependencies: - pg: ^8 + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.13.1: - resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==} - engines: {node: '>= 8.0.0'} + pg@8.16.3: + resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} + engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' peerDependenciesMeta: @@ -7183,11 +7777,8 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -7201,60 +7792,74 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pid-port@1.0.0: - resolution: {integrity: sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pid-port@1.0.2: + resolution: {integrity: sha512-Khqp07zX8IJpmIg56bHrLxS3M0iSL4cq6wnMq8YE7r/hSw3Kn4QxYS6QJg8Bs22Z7CSVj7eSsxFuigYVIFWmjg==} engines: {node: '>=18'} - pinia@2.2.6: - resolution: {integrity: sha512-vIsR8JkDN5Ga2vAxqOE2cJj4VtsHnzpR1Fz30kClxlh0yCHfec6uoMeM3e/ddqmwFUejK3NlrcQa/shnpyT4hA==} + pid-port@2.0.0: + resolution: {integrity: sha512-EDmfRxLl6lkhPjDI+19l5pkII89xVsiCP3aGjS808f7M16DyCKSXEWthD/hjyDLn5I4gKqTVw7hSgdvdXRJDTw==} + engines: {node: '>=20'} + + pinia@3.0.3: + resolution: {integrity: sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==} peerDependencies: - '@vue/composition-api': ^1.4.0 typescript: '>=4.4.4' - vue: ^2.6.14 || ^3.5.11 + vue: ^2.7.0 || ^3.5.11 peerDependenciesMeta: - '@vue/composition-api': - optional: true typescript: optional: true pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - pino-http@10.3.0: - resolution: {integrity: sha512-kaHQqt1i5S9LXWmyuw6aPPqYW/TjoDPizPs4PnDW4hSpajz2Uo/oisNliLf7We1xzpiLacdntmw8yaZiEkppQQ==} + pino-http@10.5.0: + resolution: {integrity: sha512-hD91XjgaKkSsdn8P7LaebrNzhGTdB086W3pyPihX0EzGPjq5uBJBXo4N5guqNaK6mUjg9aubMF7wDViYek9dRA==} - pino-pretty@12.0.0: - resolution: {integrity: sha512-Cx08RuTg6337DbzXqiHpo+2ej0K2FwnyLYIHCmbB5ZhVXJA5XV7zTnvSGoeEERVIGTW9yj7XNtgS+5LpzRdR8w==} + pino-pretty@13.1.2: + resolution: {integrity: sha512-3cN0tCakkT4f3zo9RXDIhy6GTvtYD6bK4CRBLN9j3E/ePqN1tugAXD5rGVfoChW6s0hiek+eyYlLNqc/BG7vBQ==} hasBin: true pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@9.5.0: - resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} + pino@9.13.1: + resolution: {integrity: sha512-Szuj+ViDTjKPQYiKumGmEn3frdl+ZPSdosHyt9SnUevFosOkMY2b7ipxlEctNKPmMD/VibeBI+ZcZCJK+4DPuw==} hasBin: true + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + pkg-dir@7.0.0: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} - pkg-dir@8.0.0: - resolution: {integrity: sha512-4peoBq4Wks0riS0z8741NVv+/8IiTvqnZAr8QGgtdifrtpdXbNw/FxRS1l6NFqm4EMzuS0EDqNNx4XGaz8cuyQ==} + pkg-dir@9.0.0: + resolution: {integrity: sha512-BMmxOuokumBehLGYwCKMBJxpAGSBbvGTtDn1yUV9UpCAvC4F7UWHoPTGSDGPV8eQPkYq/G8b0g1W5vIc5K/EhA==} engines: {node: '>=18'} + deprecated: Renamed to `package-directory`. - pkg-types@1.2.0: - resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.46.1: - resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} + playwright-core@1.56.0: + resolution: {integrity: sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==} engines: {node: '>=18'} hasBin: true - playwright@1.46.1: - resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} + playwright@1.56.0: + resolution: {integrity: sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==} engines: {node: '>=18'} hasBin: true @@ -7266,187 +7871,191 @@ packages: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-calc@10.0.2: - resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} + postcss-calc@10.1.1: + resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==} engines: {node: ^18.12 || ^20.9 || >=22.0} peerDependencies: postcss: ^8.4.38 - postcss-colormin@7.0.2: - resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} + postcss-colormin@7.0.4: + resolution: {integrity: sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-convert-values@7.0.4: - resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} + postcss-convert-values@7.0.7: + resolution: {integrity: sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-discard-comments@7.0.3: - resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} + postcss-discard-comments@7.0.4: + resolution: {integrity: sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-discard-duplicates@7.0.1: - resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} + postcss-discard-duplicates@7.0.2: + resolution: {integrity: sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-discard-empty@7.0.0: - resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + postcss-discard-empty@7.0.1: + resolution: {integrity: sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-discard-overridden@7.0.0: - resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + postcss-discard-overridden@7.0.1: + resolution: {integrity: sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-merge-longhand@7.0.4: - resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} + postcss-merge-longhand@7.0.5: + resolution: {integrity: sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-merge-rules@7.0.4: - resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} + postcss-merge-rules@7.0.6: + resolution: {integrity: sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-minify-font-values@7.0.0: - resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + postcss-minify-font-values@7.0.1: + resolution: {integrity: sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-minify-gradients@7.0.0: - resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + postcss-minify-gradients@7.0.1: + resolution: {integrity: sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-minify-params@7.0.2: - resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} + postcss-minify-params@7.0.4: + resolution: {integrity: sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-minify-selectors@7.0.4: - resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} + postcss-minify-selectors@7.0.5: + resolution: {integrity: sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-charset@7.0.0: - resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + postcss-normalize-charset@7.0.1: + resolution: {integrity: sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-display-values@7.0.0: - resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + postcss-normalize-display-values@7.0.1: + resolution: {integrity: sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-positions@7.0.0: - resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + postcss-normalize-positions@7.0.1: + resolution: {integrity: sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-repeat-style@7.0.0: - resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + postcss-normalize-repeat-style@7.0.1: + resolution: {integrity: sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-string@7.0.0: - resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + postcss-normalize-string@7.0.1: + resolution: {integrity: sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-timing-functions@7.0.0: - resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + postcss-normalize-timing-functions@7.0.1: + resolution: {integrity: sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-unicode@7.0.2: - resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} + postcss-normalize-unicode@7.0.4: + resolution: {integrity: sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-url@7.0.0: - resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + postcss-normalize-url@7.0.1: + resolution: {integrity: sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-normalize-whitespace@7.0.0: - resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + postcss-normalize-whitespace@7.0.1: + resolution: {integrity: sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-ordered-values@7.0.1: - resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} + postcss-ordered-values@7.0.2: + resolution: {integrity: sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-reduce-initial@7.0.2: - resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} + postcss-reduce-initial@7.0.4: + resolution: {integrity: sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-reduce-transforms@7.0.0: - resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + postcss-reduce-transforms@7.0.1: + resolution: {integrity: sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss-svgo@7.0.1: - resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-svgo@7.1.0: + resolution: {integrity: sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==} engines: {node: ^18.12.0 || ^20.9.0 || >= 18} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 - postcss-unique-selectors@7.0.3: - resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} + postcss-unique-selectors@7.0.4: + resolution: {integrity: sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} + postgres-array@3.0.4: + resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} + engines: {node: '>=12'} + postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} engines: {node: '>=0.10.0'} @@ -7455,23 +8064,40 @@ packages: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - preact@10.23.2: - resolution: {integrity: sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==} + postgres-interval@4.0.2: + resolution: {integrity: sha512-EMsphSQ1YkQqKZL2cuG0zHkmjCCzQqQ71l2GXITqRwjhRleCdv00bDk/ktaSi0LnlaPzAc3535KTrjXsTdtx7A==} + engines: {node: '>=12'} + + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@7.1.0: + resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} + engines: {node: '>=20'} + + pretty-format@30.2.0: + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - pretty-ms@9.1.0: - resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} proc-log@4.2.0: @@ -7485,8 +8111,8 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -7499,8 +8125,8 @@ packages: promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} - promise-call-limit@3.0.1: - resolution: {integrity: sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==} + promise-call-limit@3.0.2: + resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} @@ -7510,6 +8136,9 @@ packages: bluebird: optional: true + promise-limit@2.7.0: + resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + promise-queue@2.2.5: resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} engines: {node: '>= 0.8.0'} @@ -7525,20 +8154,20 @@ packages: property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - prosemirror-changeset@2.2.1: - resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} prosemirror-collab@1.3.1: resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} - prosemirror-commands@1.6.2: - resolution: {integrity: sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==} + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} - prosemirror-dropcursor@1.8.1: - resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} prosemirror-gapcursor@1.3.2: resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} @@ -7546,32 +8175,32 @@ packages: prosemirror-history@1.4.1: resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} - prosemirror-inputrules@1.4.0: - resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + prosemirror-inputrules@1.5.0: + resolution: {integrity: sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==} - prosemirror-keymap@1.2.2: - resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.1: - resolution: {integrity: sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==} + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} - prosemirror-menu@1.2.4: - resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} - prosemirror-model@1.23.0: - resolution: {integrity: sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==} + prosemirror-model@1.25.3: + resolution: {integrity: sha512-dY2HdaNXlARknJbrManZ1WyUtos+AP97AmvqdOQtWtrrC5g4mohVX5DTi9rXNFSk09eczLq9GuNTtq3EfMeMGA==} - prosemirror-schema-basic@1.2.3: - resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} - prosemirror-schema-list@1.4.1: - resolution: {integrity: sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==} + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} prosemirror-state@1.4.3: resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} - prosemirror-tables@1.6.1: - resolution: {integrity: sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==} + prosemirror-tables@1.8.1: + resolution: {integrity: sha512-DAgDoUYHCcc6tOGpLVPSU1k84kCUWTWnfWX3UDy2Delv4ryH0KqTD6RBI6k4yi9j9I8gl3j8MkPpRD/vWPZbug==} prosemirror-trailing-node@3.0.0: resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} @@ -7580,21 +8209,18 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.10.2: - resolution: {integrity: sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==} - - prosemirror-view@1.36.0: - resolution: {integrity: sha512-U0GQd5yFvV5qUtT41X1zCQfbw14vkbbKwLlQXhdylEmgpYVHkefXYcC4HHwWOfZa3x6Y8wxDLUBv7dxN5XQ3nA==} + prosemirror-transform@1.10.4: + resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==} - proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + prosemirror-view@1.41.3: + resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==} - protobufjs@7.4.0: - resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} - protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + protocols@2.0.2: + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -7607,34 +8233,26 @@ packages: resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} - punycode@1.3.2: - resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - querystring@0.2.0: - resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -7642,9 +8260,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} @@ -7658,35 +8273,23 @@ packages: radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - random-bytes@1.0.0: - resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} - engines: {node: '>= 0.8'} - - randombytes@2.0.3: - resolution: {integrity: sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==} - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - randomstring@1.3.0: - resolution: {integrity: sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==} - hasBin: true - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + read-cmd-shim@4.0.0: resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7695,38 +8298,6 @@ packages: resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - read-package-json@2.1.2: - resolution: {integrity: sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==} - deprecated: This package is no longer supported. Please use @npmcli/package-json instead. - - read-package-tree@5.3.1: - resolution: {integrity: sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==} - deprecated: The functionality that this package provided is now in @npmcli/arborist - - read-pkg-up@10.1.0: - resolution: {integrity: sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==} - engines: {node: '>=16'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg-up@8.0.0: - resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} - engines: {node: '>=12'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - read-pkg@6.0.0: - resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} - engines: {node: '>=12'} - - read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -7734,36 +8305,24 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - readdir-scoped-modules@1.1.0: - resolution: {integrity: sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==} - deprecated: This functionality has been moved to @npmcli/fs - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} + 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'} - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} @@ -7777,11 +8336,17 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - regex@4.3.3: - resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} @@ -7791,18 +8356,10 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true - relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7811,19 +8368,20 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.4.0: - resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} engines: {node: '>=8.6.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -7835,8 +8393,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true responselike@2.0.1: @@ -7850,15 +8409,12 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - retry-as-promised@7.0.4: - resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==} - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: @@ -7869,40 +8425,40 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup-plugin-visualizer@5.12.0: - resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} - engines: {node: '>=14'} + rollup-plugin-visualizer@6.0.4: + resolution: {integrity: sha512-q8Q7J/6YofkmaGW1sH/fPRAz37x/+pd7VBuaUU7lwvOS/YikuiiEU9jeb9PH8XHiq50XFrUsBbOxeAMYQ7KZkg==} + engines: {node: '>=18'} hasBin: true peerDependencies: + rolldown: 1.x || ^1.0.0-beta rollup: 2.x || 3.x || 4.x peerDependenciesMeta: + rolldown: + optional: true rollup: optional: true - rollup@4.24.4: - resolution: {integrity: sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==} + rollup@4.52.4: + resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - router@2.0.0: - resolution: {integrity: sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==} - engines: {node: '>= 0.10'} - - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + run-async@4.0.6: + resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} engines: {node: '>=0.12.0'} run-parallel@1.2.0: @@ -7911,9 +8467,8 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -7921,14 +8476,6 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - safe-require@1.0.4: - resolution: {integrity: sha512-1elAbSH1u7HVMfbuqktLWAN0wMOeT+FnJVqMhBgEJLvL95m+KT433tiJdGMV1e3TstQXRt1YrKQDRBu0Kpk4WA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -7936,18 +8483,26 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.79.5: - resolution: {integrity: sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==} + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} engines: {node: '>=14.0.0'} hasBin: true - sax@1.2.1: - resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + 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'} + scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} @@ -7955,14 +8510,11 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - search-insights@2.17.0: - resolution: {integrity: sha512-AskayU3QNsXQzSL6v4LTYST7NNfs2HWyHHB+sdORP9chsytAhro5XRfToAMI/LAVYgNbzowVZTMfBRodgbUHKg==} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - selderee@0.11.0: - resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} @@ -7977,91 +8529,27 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - send@1.1.0: - resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} - sequelize-cli@6.6.2: - resolution: {integrity: sha512-V8Oh+XMz2+uquLZltZES6MVAD+yEnmMfwfn+gpXcDiwE3jyQygLt4xoI0zG8gKt6cRcs84hsKnXAKDQjG/JAgg==} - engines: {node: '>=10.0.0'} - hasBin: true - - sequelize-pool@7.1.0: - resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==} - engines: {node: '>= 10.0.0'} - - sequelize-replace-enum-postgres@1.6.0: - resolution: {integrity: sha512-0lWC2zaPI0owkg38eMNkNO+4j8L4RsjasnFd1XiI2hpPWzKMPHDLroIeTdMNzs/kpB+VtLJI0bIHBZK4RhK2KA==} - - sequelize@6.37.5: - resolution: {integrity: sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==} - engines: {node: '>=10.0.0'} - peerDependencies: - ibm_db: '*' - mariadb: '*' - mysql2: '*' - oracledb: '*' - pg: '*' - pg-hstore: '*' - snowflake-sdk: '*' - sqlite3: '*' - tedious: '*' - peerDependenciesMeta: - ibm_db: - optional: true - mariadb: - optional: true - mysql2: - optional: true - oracledb: - optional: true - pg: - optional: true - pg-hstore: - optional: true - snowflake-sdk: - optional: true - sqlite3: - optional: true - tedious: - optional: true - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} serve-placeholder@2.0.2: resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - - serve-static@2.1.0: - resolution: {integrity: sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==} + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -8074,22 +8562,34 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + shelljs@0.10.0: + resolution: {integrity: sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==} + engines: {node: '>=18'} - shiki@1.22.2: - resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} signal-exit@3.0.7: @@ -8103,22 +8603,12 @@ packages: resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} engines: {node: ^16.14.0 || >=18.0.0} - simple-git@3.25.0: - resolution: {integrity: sha512-KIY5sBnzc4yEcJXW7Tdv4viEz8KyG+nU0hay+DWZasvdFOYKeUZ6Xc25LUHHjw0tinPT7O1eY6pzX7pRT1K8rw==} - - simple-git@3.27.0: - resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + simple-git@3.28.0: + resolution: {integrity: sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==} - simple-oauth2@5.1.0: - resolution: {integrity: sha512-gWDa38Ccm4MwlG5U7AlcJxPv3lvr80dU7ARJWrGdgvOKyzSj1gr3GBPN1rABTedAYvC/LsGYoFuFxwDBPtGEbw==} - - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -8127,19 +8617,12 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} - - slick@1.12.2: - resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} + slow-redact@0.3.2: + resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} @@ -8148,32 +8631,27 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} engines: {node: '>= 14'} - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sort-keys@5.0.0: - resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} - engines: {node: '>=12'} - sortablejs@1.14.0: resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -8185,6 +8663,10 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -8200,8 +8682,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} @@ -8214,15 +8696,30 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sqlstring-sqlite@0.1.1: + resolution: {integrity: sha512-9CAYUJ0lEUPYJrswqiqdINNSfq3jqWo/bFJ7tufdoNeSK0Fy+d1kFTxjqO9PIqza0Kri+ZtYMfPVf1aZaFOvrQ==} + engines: {node: '>= 0.6'} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + srvx@0.8.16: + resolution: {integrity: sha512-hmcGW4CgroeSmzgF1Ihwgl+Ths0JqAJ7HwjP2X7e3JzY7u4IydLMcdnlqGQiQGUswz+PO9oh/KtCpOISIvs9QQ==} + engines: {node: '>=20.16.0'} + hasBin: true ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -8231,30 +8728,32 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.19.0: - resolution: {integrity: sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -8267,16 +8766,9 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -8291,10 +8783,18 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -8307,37 +8807,52 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - stylehacks@7.0.4: - resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + + structured-clone-es@1.0.0: + resolution: {integrity: sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ==} + + stylehacks@7.0.6: + resolution: {integrity: sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: - postcss: ^8.4.31 + postcss: ^8.4.32 + + superagent@10.2.3: + resolution: {integrity: sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==} + engines: {node: '>=14.18.0'} - superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supertest@7.1.4: + resolution: {integrity: sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==} + engines: {node: '>=14.18.0'} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -8347,38 +8862,57 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - - svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} + svgo@4.0.0: + resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} + engines: {node: '>=16'} hasBin: true + swagger-ui-dist@5.21.0: + resolution: {integrity: sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg==} + + swagger-ui-dist@5.29.4: + resolution: {integrity: sha512-gJFDz/gyLOCQtWwAgqs6Rk78z9ONnqTnlW11gimG9nLap8drKa3AJBKpzIQMIjl5PD2Ix+Tn+mc/tfoT2tgsng==} + + 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'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} + systeminformation@5.27.11: + resolution: {integrity: sha512-K3Lto/2m3K2twmKHdgx5B+0in9qhXK4YnoT9rIlgwN/4v7OV5c8IjbeAUkuky/6VzCQC7iKCAqi8rZathCdjHg==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-stream@3.1.7: @@ -8388,30 +8922,52 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + + tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + taskkill@5.0.0: resolution: {integrity: sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ==} engines: {node: '>=14.16'} - terser@5.36.0: - resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + 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.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true - text-decoder@1.1.1: - resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - timers-ext@0.1.8: - resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} - engines: {node: '>=0.12'} + tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} @@ -8419,8 +8975,11 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tippy.js@6.3.7: @@ -8429,13 +8988,19 @@ packages: title-case-minors@1.0.0: resolution: {integrity: sha512-GFT+1ZjqJgq5AywOXjl9VelGgqMpOtfwdxYaYy3eUE1gbyxneeSnADLoov7TxXelqftIhlblsnHVqw5hNFUbGQ==} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tldts-core@7.0.17: + resolution: {integrity: sha512-DieYoGrP78PWKsrXr8MZwtQ7GLCUeLxihtjC1jZsW1DnvSMdKPitJSe8OSYDM2u5H6g3kWJZpePqkp43TfLh0g==} + + tldts@7.0.17: + resolution: {integrity: sha512-Y1KQBgDd/NUc+LfOtKS6mNsC9CCaH+m2P1RoIZy7RAPo3C3/t8X45+zgut31cRZtZ3xKPjfn3TkGTrctC2TQIQ==} + hasBin: true + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-camel-case@1.0.0: resolution: {integrity: sha512-nD8pQi5H34kyu1QDMFjzEIYqk0xa9Alt6ZfrdEMuHCFOfTLhDG5pgTu/aAM9Wt9lXILwlXmWP43b8sav0GNE8Q==} @@ -8452,10 +9017,6 @@ packages: to-dot-case@1.0.0: resolution: {integrity: sha512-gwKmnzzTGdPiMWTFFpRYqB3dQpVJgAxuhEYEM+7Vbqd6quFfvdhZPXlqRLf8jIaWL3qCX/rxTW9Y2eeSTJP9/w==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-no-case@1.0.2: resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} @@ -8485,8 +9046,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - toposort-class@1.0.1: - resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} + token-types@6.1.1: + resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} + engines: {node: '>=14.16'} toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} @@ -8495,20 +9057,16 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true - - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -8521,18 +9079,73 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + ts-jest@29.4.5: + resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + esbuild: '*' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + jest-util: + optional: true + + ts-loader@9.5.4: + resolution: {integrity: sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-morph@27.0.2: + resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true peerDependencies: - typescript: '>=4.2.0' + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + 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.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tuf-js@2.2.1: resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} @@ -8542,136 +9155,102 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - - type-fest@4.25.0: - resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.1.0: + resolution: {integrity: sha512-wQ531tuWvB6oK+pchHIu5lHe5f5wpSCqB8Kf4dWQRbOYc9HTge7JL0G4Qd44bh6QuJCccIzL3bugb8GI0MwHrg==} + engines: {node: '>=20'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type-is@2.0.0: - resolution: {integrity: sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + type-level-regexp@0.1.17: + resolution: {integrity: sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==} typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} - uglify-js@3.19.2: - resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uid-safe@2.1.5: - resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} - engines: {node: '>= 0.8'} + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} - ultrahtml@1.5.3: - resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} - umzug@2.3.0: - resolution: {integrity: sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw==} - engines: {node: '>=6.0.0'} + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} umzug@3.8.2: resolution: {integrity: sha512-BEWEF8OJjTYVC56GjELeHl/1XjFejrD7aHzn+HldRJTx+pL1siBrKHZC8n4K/xL3bEzVA9o++qD1tK2CpZu4KA==} engines: {node: '>=12'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - unctx@2.3.1: - resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==} - - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + unctx@2.4.1: + resolution: {integrity: sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} - unenv@1.10.0: - resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} - unhead@1.11.11: - resolution: {integrity: sha512-98tM2R8OWJhvS6uqTewkfIrsPqFU/VwnKpU2tVZ+jPXSWgWSLmM3K2Y2v5AEM4bZjmC/XH8pLVGzbqB7xzFI/Q==} + unenv@2.0.0-rc.21: + resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + unhead@2.0.19: + resolution: {integrity: sha512-gEEjkV11Aj+rBnY6wnRfsFtF2RxKOLaPN4i+Gx3UhBxnszvV6ApSNZbGk7WKyy/lErQ6ekPN63qdFL7sa1leow==} unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} - unimport@3.11.1: - resolution: {integrity: sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==} - - unimport@3.13.1: - resolution: {integrity: sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==} + unimport@5.4.1: + resolution: {integrity: sha512-wMZ2JKUCleCK2zfRHeWcbrUHKXOC3SVBYkyn/wTGzh0THX6sT4hSjuKXxKANN4/WMbT6ZPM4JzcDcnhD2x9Bpg==} + engines: {node: '>=18.12.0'} unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} @@ -8696,14 +9275,6 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -8712,43 +9283,52 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin-vue-router@0.10.8: - resolution: {integrity: sha512-xi+eLweYAqolIoTRSmumbi6Yx0z5M0PLvl+NFNVWHJgmE2ByJG1SZbrn+TqyuDtIyln20KKgq8tqmL7aLoiFjw==} + unplugin-utils@0.2.5: + resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} + engines: {node: '>=18.12.0'} + + unplugin-utils@0.3.1: + resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} + engines: {node: '>=20.19.0'} + + unplugin-vue-router@0.15.0: + resolution: {integrity: sha512-PyGehCjd9Ny9h+Uer4McbBjjib3lHihcyUEILa7pHKl6+rh8N7sFyw4ZkV+N30Oq2zmIUG7iKs3qpL0r+gXAaQ==} peerDependencies: - vue-router: ^4.4.0 + '@vue/compiler-sfc': ^3.5.17 + vue-router: ^4.5.1 peerDependenciesMeta: vue-router: optional: true - unplugin@1.12.2: - resolution: {integrity: sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==} - engines: {node: '>=14.0.0'} + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} - unplugin@1.15.0: - resolution: {integrity: sha512-jTPIs63W+DUEDW207ztbaoO7cQ4p5aVaB823LSlxpsFEU3Mykwxf3ZGC/wzxFJeZlASZYgVrWeo7LgOrqJZ8RA==} - engines: {node: '>=14.0.0'} - peerDependencies: - webpack-sources: ^3 - peerDependenciesMeta: - webpack-sources: - optional: true + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - unstorage@1.13.1: - resolution: {integrity: sha512-ELexQHUrG05QVIM/iUeQNdl9FXDZhqLJ4yP59fnmn2jGUh0TEulwOgov1ubOb3Gt2ZGK/VMchJwPDNVEGWQpRg==} + unstorage@1.17.1: + resolution: {integrity: sha512-KKGwRTT0iVBCErKemkJCLs7JdxNVfqTPc/85ae1XES0+bsHbc/sFBfVi5kJp156cc51BHinIH2l3k0EZ24vOBQ==} peerDependencies: - '@azure/app-configuration': ^1.7.0 - '@azure/cosmos': ^4.1.1 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.5.0 + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.25.0 - '@capacitor/preferences': ^6.0.2 - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6.0.3 || ^7.0.0 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 '@planetscale/database': ^1.19.0 '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 '@vercel/kv': ^1.0.1 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' idb-keyval: ^6.2.1 - ioredis: ^5.4.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 peerDependenciesMeta: '@azure/app-configuration': optional: true @@ -8764,63 +9344,55 @@ packages: optional: true '@capacitor/preferences': optional: true + '@deno/kv': + optional: true '@netlify/blobs': optional: true '@planetscale/database': optional: true '@upstash/redis': optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true '@vercel/kv': optional: true + aws4fetch: + optional: true + db0: + optional: true idb-keyval: optional: true ioredis: optional: true - - untildify@5.0.0: - resolution: {integrity: sha512-bOgQLUnd2G5rhzaTvh1VCI9Fo6bC5cLTpH17T5aFfamyXFYDbbdzN6IXdeoc3jBS7T9hNTmJtYUzJCJ2Xlc9gA==} - engines: {node: '>=16'} + uploadthing: + optional: true untun@0.1.3: resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} hasBin: true - untyped@1.4.2: - resolution: {integrity: sha512-nC5q0DnPEPVURPhfPQLahhSTnemVtPzdx7ofiRxXpOB2SYnb3MfdU3DVGyJdS8Lx+tBWeAePO8BfU/3EgksM7Q==} - hasBin: true - - untyped@1.5.1: - resolution: {integrity: sha512-reBOnkJBFfBZ8pCKaeHgfZLcehXtM6UTxc+vqs1JvCps0c4amLNp3fhdGBZwYp+VLyoY9n3X5KOP7lCyWBUX9A==} + untyped@2.0.0: + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} hasBin: true - unwasm@0.3.9: - resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + unwasm@0.3.11: + resolution: {integrity: sha512-Vhp5gb1tusSQw5of/g3Q697srYgMXvwMgXMjcG4ZNga02fDX9coxJ9fAb0Ci38hM2Hv/U1FXRPGgjP2BYqhNoQ==} upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - uri-js-replace@1.0.1: - resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -8831,50 +9403,26 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - url@0.10.3: - resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} - - urlpattern-polyfill@8.0.2: - resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} - - user@0.0.0: - resolution: {integrity: sha512-eRNM5isOvr6aEFAGi1CqAkmLkYxW2NJ5ThhbD+6IJXYKM1mo7Gtxx4mQIveHz/5K3p/SVnlW9k17ETn+QAu8IQ==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util-promisify@2.1.0: - resolution: {integrity: sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - uuid@8.0.0: - resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + uuid@13.0.0: + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true v-clipboard@3.0.0-next.1: resolution: {integrity: sha512-UvCnzetQMlVfk9yoiyew8ldGiCzeER5aYdmXXtZp8LC6rt2QXQS0AayEDn1K7rlXpd3M8d+JeYNUV+ZNgtaS4A==} - valid-data-url@3.0.1: - resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} - engines: {node: '>=10'} + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -8883,54 +9431,54 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vee-validate@4.13.2: - resolution: {integrity: sha512-HlpR/6MJ92TW9f135umMZKUqdd/tFQTxLNSf2ImbU4Y/MlLVAUpF1l64VdjTOhbClAqPjCb5p/SqHDxLpUHXrw==} - peerDependencies: - vue: ^3.4.26 - - vee-validate@4.14.6: - resolution: {integrity: sha512-5w6e+YqJFLfzRR6gmRZgE6ZIVZ5nW1UAQdAlu78Oy3CFVrhTraqMMsfDC/Kmz7CNtCpIYaXxC8oKfr2hAiTnew==} + vee-validate@4.15.1: + resolution: {integrity: sha512-DkFsiTwEKau8VIxyZBGdO6tOudD+QoUBPuHj3e6QFqmbfCRj1ArmYWue9lEp6jLSWBIw4XPlDLjFIZNLdRAMSg==} peerDependencies: vue: ^3.4.26 - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-hot-client@0.2.3: - resolution: {integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==} + vite-dev-rpc@1.1.0: + resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} peerDependencies: - vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 - vite-node@2.1.4: - resolution: {integrity: sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-hot-client@2.1.0: + resolution: {integrity: sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==} + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-plugin-checker@0.7.2: - resolution: {integrity: sha512-xeYeJbG0gaCaT0QcUC4B2Zo4y5NR8ZhYenc5gPbttrZvraRFwkEADCYwq+BfEHl9zYz7yf85TxsiGoYwyyIjhw==} + vite-plugin-checker@0.10.3: + resolution: {integrity: sha512-f4sekUcDPF+T+GdbbE8idb1i2YplBAoH+SfRS0e/WRBWb2rYb1Jf5Pimll0Rj+3JgIYWwG2K5LtBPCXxoibkLg==} engines: {node: '>=14.16'} peerDependencies: '@biomejs/biome': '>=1.7' eslint: '>=7' - meow: ^9.0.0 - optionator: ^0.9.1 - stylelint: '>=13' + meow: ^13.2.0 + optionator: ^0.9.4 + stylelint: '>=16' typescript: '*' vite: '>=2.0.0' vls: '*' vti: '*' - vue-tsc: '>=2.0.0' + vue-tsc: ~2.2.10 || ^3.0.0 peerDependenciesMeta: '@biomejs/biome': optional: true @@ -8951,23 +9499,24 @@ packages: vue-tsc: optional: true - vite-plugin-inspect@0.8.7: - resolution: {integrity: sha512-/XXou3MVc13A5O9/2Nd6xczjrUwt7ZyI9h8pTnUMkr5SshLcb0PJUOVq2V+XVkdeU4njsqAtmK87THZuO2coGA==} + vite-plugin-inspect@11.3.3: + resolution: {integrity: sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': '*' - vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: '@nuxt/kit': optional: true - vite-plugin-vue-inspector@5.1.3: - resolution: {integrity: sha512-pMrseXIDP1Gb38mOevY+BvtNGNqiqmqa2pKB99lnLsADQww9w9xMbAfT4GB6RUoaOkSPrtlXqpq2Fq+Dj2AgFg==} + vite-plugin-vue-tracer@1.0.1: + resolution: {integrity: sha512-L5/vAhT6oYbH4RSQYGLN9VfHexWe7SGzca1pJ7oPkL6KtxWA1jbGeb3Ri1JptKzqtd42HinOq4uEYqzhVWrzig==} peerDependencies: - vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + vite: ^6.0.0 || ^7.0.0 + vue: ^3.5.0 - vite@5.4.10: - resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + vite@5.4.20: + resolution: {integrity: sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -8997,8 +9546,48 @@ packages: terser: optional: true - vitepress@1.5.0: - resolution: {integrity: sha512-q4Q/G2zjvynvizdB3/bupdYkCJe2umSAMv9Ju4d92E6/NXJ59z70xB0q5p/4lpRyAwflDsbwy1mLV9Q5+nlB+g==} + vite@7.1.9: + resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.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 + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -9009,72 +9598,34 @@ packages: postcss: optional: true - vscode-jsonrpc@6.0.0: - resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} - engines: {node: '>=8.0.0 || >=10.0.0'} - - vscode-languageclient@7.0.0: - resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} - engines: {vscode: ^1.52.0} - - vscode-languageserver-protocol@3.16.0: - resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - vscode-languageserver-types@3.16.0: - resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} - - vscode-languageserver@7.0.0: - resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} - hasBin: true - - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - vue-bundle-renderer@2.1.1: - resolution: {integrity: sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==} - - vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true + vue-bundle-renderer@2.2.0: + resolution: {integrity: sha512-sz/0WEdYH1KfaOm0XaBmRZOWgYTEvUDt6yPYaUzl4E52qzgWLlknaPPTTZmp6benaPTlQAI/hN1x3tAzZygycg==} vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} - vue-eslint-parser@9.4.3: - resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} - engines: {node: ^14.17.0 || >=16.0.0} + vue-eslint-parser@10.2.0: + resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=6.0.0' + eslint: ^8.57.0 || ^9.0.0 - vue-router@4.4.5: - resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==} + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} peerDependencies: vue: ^3.2.0 - vue-tsc@2.1.6: - resolution: {integrity: sha512-f98dyZp5FOukcYmbFpuSCJ4Z0vHSOSmxGttZJCsFeX0M4w/Rsq0s4uKXjcSRsZqsRgQa6z7SfuO+y0HVICE57Q==} - hasBin: true - peerDependencies: - typescript: '>=5.0.0' - - vue3-tree-vue@2.0.11: - resolution: {integrity: sha512-q86kgJvld0mOTI9RVP9vU2pyAdEzuOBGNIsMkRgbj6E2jgRRgVCW/atw+d3ItedvXSm9zuyH69Q4liXQNFu7gw==} + vue3-tree-vue@2.0.15: + resolution: {integrity: sha512-9SeBuervVBNgyGJS6c7CD9nuaZpzpbdCUHaerk5vXOYgBwJAlle6EMbqm/H+OD09SCMy5NLoLimzCMTr15eU1A==} engines: {node: '>=12'} peerDependencies: vue: ^3.0.5 - vue@3.5.12: - resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -9086,38 +9637,37 @@ packages: peerDependencies: vue: ^3.0.1 - vuetify@3.7.0: - resolution: {integrity: sha512-x+UaU4SPYNcJSE/voCTBFrNn0q9Spzx2EMfDdUj0NYgHGKb59OqnZte+AjaJaoOXy1AHYIGEpm5Ryk2BEfgWuw==} - engines: {node: ^12.20 || >=14.13} - peerDependencies: - typescript: '>=4.7' - vite-plugin-vuetify: '>=1.0.0' - vue: ^3.3.0 - vue-i18n: ^9.0.0 - webpack-plugin-vuetify: '>=2.0.0' + vuetify@3.10.5: + resolution: {integrity: sha512-3h1onfjcj04B+LJ0cXvGrOOe6C3652JAlyUAuGKgQXwhP9Oe1hAfdM6+svXR5Dt1xC39lQEGqJdacZtwisUEoQ==} + peerDependencies: + typescript: '>=4.7' + vite-plugin-vuetify: '>=2.1.0' + vue: ^3.5.0 + webpack-plugin-vuetify: '>=3.1.0' peerDependenciesMeta: typescript: optional: true vite-plugin-vuetify: optional: true - vue-i18n: - optional: true webpack-plugin-vuetify: optional: true - vuetify@3.7.4: - resolution: {integrity: sha512-Y8UU5wUDQXC3oz2uumPb8IOdvB4XMCxtxnmqdOc+LihNuPlkSgxIwf92ndRzbOtJFKHsggFUxpyLqpQp+A+5kg==} + vuetify@3.7.0: + resolution: {integrity: sha512-x+UaU4SPYNcJSE/voCTBFrNn0q9Spzx2EMfDdUj0NYgHGKb59OqnZte+AjaJaoOXy1AHYIGEpm5Ryk2BEfgWuw==} engines: {node: ^12.20 || >=14.13} peerDependencies: typescript: '>=4.7' vite-plugin-vuetify: '>=1.0.0' vue: ^3.3.0 + vue-i18n: ^9.0.0 webpack-plugin-vuetify: '>=2.0.0' peerDependenciesMeta: typescript: optional: true vite-plugin-vuetify: optional: true + vue-i18n: + optional: true webpack-plugin-vuetify: optional: true @@ -9131,31 +9681,48 @@ packages: walk-up-path@3.0.1: resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-resource-inliner@6.0.1: - resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} - engines: {node: '>=10.0.0'} - - web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} + + webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.100.2: + resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -9164,56 +9731,39 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - which@4.0.0: resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true widest-line@5.0.0: resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} engines: {node: '>=18'} - wkx@0.5.0: - resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -9226,8 +9776,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} wrappy@1.0.2: @@ -9237,8 +9787,8 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9249,6 +9799,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -9257,14 +9811,6 @@ packages: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} - xml2js@0.6.2: - resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} @@ -9272,9 +9818,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -9285,34 +9828,19 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml-ast-parser@0.0.43: - resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} - yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} - engines: {node: '>= 14'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -9320,35 +9848,42 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yn@5.0.0: - resolution: {integrity: sha512-+l37+9TyGEsyxGLaTg6QgYy5KnOp74ZZl4dPFLQpBWSkO99uBC5jnS0pOGwXFViPbiaEtWbParH2KrgWWF2duQ==} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yn@5.1.0: + resolution: {integrity: sha512-TfXLvT6eVsBNIm8rAXTwJYdQFtOXaHQ+rA7LU8HL8C/BFfaSfhvFE5T1rHAdBCbAj808HaqjXVkmo8jmeGOqhw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - yoctodelay@1.2.0: - resolution: {integrity: sha512-12y/P9MSig9/5BEhBgylss+fkHiCRZCvYR81eH35NW9uw801cvJt31EAV+WOLcwZRZbLiIQl/hxcdXXXFmGvXg==} - engines: {node: '>=4'} + yoctodelay@2.0.0: + resolution: {integrity: sha512-0m1YaiUEnEPrZ7mKxkfRpPLfOjG1GeWd2E2IfB8toIUEhXjk5cW+czBDiQQkkMDycsuGDkG1dP40QQQoKJmEWw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} - yup@1.4.0: - resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + youch@4.1.0-beta.11: + resolution: {integrity: sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==} - zhead@2.2.4: - resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + yup@1.7.1: + resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==} zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} @@ -9359,1374 +9894,945 @@ packages: snapshots: - '@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.0)': + '@algolia/abtesting@1.6.0': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) - search-insights: 2.17.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + '@algolia/client-search': 5.40.0 + algoliasearch: 5.40.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)': dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) - '@algolia/client-search': 4.24.0 - algoliasearch: 4.24.0 + '@algolia/client-search': 5.40.0 + algoliasearch: 5.40.0 - '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)': + '@algolia/client-abtesting@5.40.0': dependencies: - '@algolia/client-search': 4.24.0 - algoliasearch: 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/cache-browser-local-storage@4.24.0': + '@algolia/client-analytics@5.40.0': dependencies: - '@algolia/cache-common': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/cache-common@4.24.0': {} + '@algolia/client-common@5.40.0': {} - '@algolia/cache-in-memory@4.24.0': + '@algolia/client-insights@5.40.0': dependencies: - '@algolia/cache-common': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-account@4.24.0': + '@algolia/client-personalization@5.40.0': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-analytics@4.24.0': + '@algolia/client-query-suggestions@5.40.0': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-common@4.24.0': + '@algolia/client-search@5.40.0': dependencies: - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-personalization@4.24.0': + '@algolia/ingestion@1.40.0': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/client-search@4.24.0': + '@algolia/monitoring@1.40.0': dependencies: - '@algolia/client-common': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/logger-common@4.24.0': {} + '@algolia/recommend@5.40.0': + dependencies: + '@algolia/client-common': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 - '@algolia/logger-console@4.24.0': + '@algolia/requester-browser-xhr@5.40.0': dependencies: - '@algolia/logger-common': 4.24.0 + '@algolia/client-common': 5.40.0 - '@algolia/recommend@4.24.0': + '@algolia/requester-fetch@5.40.0': dependencies: - '@algolia/cache-browser-local-storage': 4.24.0 - '@algolia/cache-common': 4.24.0 - '@algolia/cache-in-memory': 4.24.0 - '@algolia/client-common': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/logger-common': 4.24.0 - '@algolia/logger-console': 4.24.0 - '@algolia/requester-browser-xhr': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/requester-node-http': 4.24.0 - '@algolia/transporter': 4.24.0 + '@algolia/client-common': 5.40.0 - '@algolia/requester-browser-xhr@4.24.0': + '@algolia/requester-node-http@5.40.0': dependencies: - '@algolia/requester-common': 4.24.0 + '@algolia/client-common': 5.40.0 - '@algolia/requester-common@4.24.0': {} + '@angular-devkit/core@19.2.15(chokidar@4.0.3)': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 - '@algolia/requester-node-http@4.24.0': + '@angular-devkit/core@19.2.17(chokidar@4.0.3)': dependencies: - '@algolia/requester-common': 4.24.0 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + optionalDependencies: + chokidar: 4.0.3 - '@algolia/transporter@4.24.0': + '@angular-devkit/schematics-cli@19.2.15(@types/node@24.7.2)(chokidar@4.0.3)': dependencies: - '@algolia/cache-common': 4.24.0 - '@algolia/logger-common': 4.24.0 - '@algolia/requester-common': 4.24.0 + '@angular-devkit/core': 19.2.15(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) + '@inquirer/prompts': 7.3.2(@types/node@24.7.2) + ansi-colors: 4.1.3 + symbol-observable: 4.0.0 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - '@types/node' + - chokidar - '@ampproject/remapping@2.3.0': + '@angular-devkit/schematics@19.2.15(chokidar@4.0.3)': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@angular-devkit/core': 19.2.15(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 + ora: 5.4.1 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar - '@antfu/utils@0.7.10': {} + '@angular-devkit/schematics@19.2.17(chokidar@4.0.3)': + dependencies: + '@angular-devkit/core': 19.2.17(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': + '@antfu/install-pkg@1.1.0': dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - tslib: 2.7.0 + package-manager-detector: 1.4.0 + tinyexec: 1.0.1 - '@aws-crypto/crc32c@5.2.0': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - tslib: 2.7.0 + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + + '@apm-js-collab/code-transformer@0.8.2': {} - '@aws-crypto/sha1-browser@5.2.0': + '@apm-js-collab/tracing-hooks@0.3.1': dependencies: - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-locate-window': 3.568.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.7.0 + '@apm-js-collab/code-transformer': 0.8.2 + debug: 4.4.3 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@asamuzakjp/css-color@4.0.5': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.2 + + '@asamuzakjp/dom-selector@6.6.2': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.2 + + '@asamuzakjp/nwsapi@2.3.9': {} '@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.686.0 - '@aws-sdk/util-locate-window': 3.568.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-locate-window': 3.893.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.7.0 + tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.686.0 - tslib: 2.7.0 + '@aws-sdk/types': 3.901.0 + tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.686.0 + '@aws-sdk/types': 3.901.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.7.0 + tslib: 2.8.1 - '@aws-sdk/client-ecs@3.637.0': + '@aws-sdk/client-ecs@3.908.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.637.0(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/client-sts': 3.637.0 - '@aws-sdk/core': 3.635.0 - '@aws-sdk/credential-provider-node': 3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/middleware-host-header': 3.620.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.620.0 - '@aws-sdk/middleware-user-agent': 3.637.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.637.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - tslib: 2.7.0 - uuid: 9.0.1 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/credential-provider-node': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.687.0': + '@aws-sdk/client-sesv2@3.908.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/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-node': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/middleware-bucket-endpoint': 3.686.0 - '@aws-sdk/middleware-expect-continue': 3.686.0 - '@aws-sdk/middleware-flexible-checksums': 3.687.0 - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-location-constraint': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-sdk-s3': 3.687.0 - '@aws-sdk/middleware-ssec': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/signature-v4-multi-region': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@aws-sdk/xml-builder': 3.686.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/eventstream-serde-browser': 3.0.11 - '@smithy/eventstream-serde-config-resolver': 3.0.8 - '@smithy/eventstream-serde-node': 3.0.10 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-blob-browser': 3.1.7 - '@smithy/hash-node': 3.0.8 - '@smithy/hash-stream-node': 3.1.7 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/md5-js': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.1.7 - tslib: 2.7.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/credential-provider-node': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/signature-v4-multi-region': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0)': + '@aws-sdk/client-sso@3.908.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.637.0 - '@aws-sdk/core': 3.635.0 - '@aws-sdk/credential-provider-node': 3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/middleware-host-header': 3.620.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.620.0 - '@aws-sdk/middleware-user-agent': 3.637.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.637.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-node': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@aws-sdk/core@3.908.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws-sdk/xml-builder': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/credential-provider-env': 3.908.0 + '@aws-sdk/credential-provider-http': 3.908.0 + '@aws-sdk/credential-provider-process': 3.908.0 + '@aws-sdk/credential-provider-sso': 3.908.0 + '@aws-sdk/credential-provider-web-identity': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.637.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.635.0 - '@aws-sdk/middleware-host-header': 3.620.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.620.0 - '@aws-sdk/middleware-user-agent': 3.637.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.637.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@aws-sdk/credential-provider-node@3.908.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.908.0 + '@aws-sdk/credential-provider-http': 3.908.0 + '@aws-sdk/credential-provider-ini': 3.908.0 + '@aws-sdk/credential-provider-process': 3.908.0 + '@aws-sdk/credential-provider-sso': 3.908.0 + '@aws-sdk/credential-provider-web-identity': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.687.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@aws-sdk/credential-provider-process@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.908.0': + dependencies: + '@aws-sdk/client-sso': 3.908.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/token-providers': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.637.0': + '@aws-sdk/credential-provider-web-identity@3.908.0': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.637.0(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/core': 3.635.0 - '@aws-sdk/credential-provider-node': 3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/middleware-host-header': 3.620.0 - '@aws-sdk/middleware-logger': 3.609.0 - '@aws-sdk/middleware-recursion-detection': 3.620.0 - '@aws-sdk/middleware-user-agent': 3.637.0 - '@aws-sdk/region-config-resolver': 3.614.0 - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.637.0 - '@aws-sdk/util-user-agent-browser': 3.609.0 - '@aws-sdk/util-user-agent-node': 3.614.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sts@3.687.0': + '@aws-sdk/middleware-host-header@3.901.0': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-node': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/middleware-host-header': 3.686.0 - '@aws-sdk/middleware-logger': 3.686.0 - '@aws-sdk/middleware-recursion-detection': 3.686.0 - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/region-config-resolver': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@aws-sdk/util-user-agent-browser': 3.686.0 - '@aws-sdk/util-user-agent-node': 3.687.0 - '@smithy/config-resolver': 3.0.10 - '@smithy/core': 2.5.1 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/hash-node': 3.0.8 - '@smithy/invalid-dependency': 3.0.8 - '@smithy/middleware-content-length': 3.0.10 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-retry': 3.0.25 - '@smithy/middleware-serde': 3.0.8 - '@smithy/middleware-stack': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.25 - '@smithy/util-defaults-mode-node': 3.0.25 - '@smithy/util-endpoints': 2.1.4 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.635.0': - dependencies: - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.0 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - fast-xml-parser: 4.4.1 - tslib: 2.7.0 - - '@aws-sdk/core@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.0 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - fast-xml-parser: 4.4.1 - tslib: 2.7.0 - - '@aws-sdk/credential-provider-env@3.620.1': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/credential-provider-env@3.686.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/credential-provider-http@3.635.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/fetch-http-handler': 3.2.9 - '@smithy/node-http-handler': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-stream': 3.2.1 - tslib: 2.7.0 - - '@aws-sdk/credential-provider-http@3.686.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/node-http-handler': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-stream': 3.2.1 - tslib: 2.7.0 - - '@aws-sdk/credential-provider-ini@3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))(@aws-sdk/client-sts@3.637.0)': - dependencies: - '@aws-sdk/client-sts': 3.637.0 - '@aws-sdk/credential-provider-env': 3.620.1 - '@aws-sdk/credential-provider-http': 3.635.0 - '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0)) - '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/types': 3.609.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-ini@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0)': - dependencies: - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/credential-provider-env': 3.686.0 - '@aws-sdk/credential-provider-http': 3.686.0 - '@aws-sdk/credential-provider-process': 3.686.0 - '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) - '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))(@aws-sdk/client-sts@3.637.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.620.1 - '@aws-sdk/credential-provider-http': 3.635.0 - '@aws-sdk/credential-provider-ini': 3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/credential-provider-process': 3.620.1 - '@aws-sdk/credential-provider-sso': 3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0)) - '@aws-sdk/credential-provider-web-identity': 3.621.0(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/types': 3.609.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt + '@aws-sdk/middleware-logger@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0)': - dependencies: - '@aws-sdk/credential-provider-env': 3.686.0 - '@aws-sdk/credential-provider-http': 3.686.0 - '@aws-sdk/credential-provider-ini': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/credential-provider-process': 3.686.0 - '@aws-sdk/credential-provider-sso': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) - '@aws-sdk/credential-provider-web-identity': 3.686.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/types': 3.686.0 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt + '@aws-sdk/middleware-recursion-detection@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@aws/lambda-invoke-store': 0.0.1 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.620.1': + '@aws-sdk/middleware-sdk-s3@3.908.0': dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.15.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.686.0': + '@aws-sdk/middleware-user-agent@3.908.0': dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@smithy/core': 3.15.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.637.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))': + '@aws-sdk/nested-clients@3.908.0': dependencies: - '@aws-sdk/client-sso': 3.637.0 - '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0)) - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.908.0 + '@aws-sdk/middleware-host-header': 3.901.0 + '@aws-sdk/middleware-logger': 3.901.0 + '@aws-sdk/middleware-recursion-detection': 3.901.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/region-config-resolver': 3.901.0 + '@aws-sdk/types': 3.901.0 + '@aws-sdk/util-endpoints': 3.901.0 + '@aws-sdk/util-user-agent-browser': 3.907.0 + '@aws-sdk/util-user-agent-node': 3.908.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/core': 3.15.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/hash-node': 4.2.0 + '@smithy/invalid-dependency': 4.2.0 + '@smithy/middleware-content-length': 4.2.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-retry': 4.4.1 + '@smithy/middleware-serde': 4.2.0 + '@smithy/middleware-stack': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/node-http-handler': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.0 + '@smithy/util-defaults-mode-node': 4.2.1 + '@smithy/util-endpoints': 3.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-sso@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': - dependencies: - '@aws-sdk/client-sso': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/token-providers': 3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@aws-sdk/region-config-resolver@3.901.0': + dependencies: + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.908.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/signature-v4': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.908.0': + dependencies: + '@aws-sdk/core': 3.908.0 + '@aws-sdk/nested-clients': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-web-identity@3.621.0(@aws-sdk/client-sts@3.637.0)': - dependencies: - '@aws-sdk/client-sts': 3.637.0 - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/credential-provider-web-identity@3.686.0(@aws-sdk/client-sts@3.687.0)': - dependencies: - '@aws-sdk/client-sts': 3.687.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/lib-storage@3.687.0(@aws-sdk/client-s3@3.687.0)': - dependencies: - '@aws-sdk/client-s3': 3.687.0 - '@smithy/abort-controller': 3.1.6 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/smithy-client': 3.4.2 - buffer: 5.6.0 - events: 3.3.0 - stream-browserify: 3.0.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-bucket-endpoint@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-arn-parser': 3.679.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-expect-continue@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-flexible-checksums@3.687.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@smithy/is-array-buffer': 3.0.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-host-header@3.620.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-host-header@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-location-constraint@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-logger@3.609.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-logger@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-recursion-detection@3.620.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-recursion-detection@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-sdk-s3@3.687.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-arn-parser': 3.679.0 - '@smithy/core': 2.5.1 - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.0 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-ssec@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-user-agent@3.637.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@aws-sdk/util-endpoints': 3.637.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/middleware-user-agent@3.687.0': - dependencies: - '@aws-sdk/core': 3.686.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-endpoints': 3.686.0 - '@smithy/core': 2.5.1 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/region-config-resolver@3.614.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 - tslib: 2.7.0 - - '@aws-sdk/region-config-resolver@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 - tslib: 2.7.0 - - '@aws-sdk/s3-request-presigner@3.687.0': - dependencies: - '@aws-sdk/signature-v4-multi-region': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@aws-sdk/util-format-url': 3.686.0 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/protocol-http': 4.1.5 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/signature-v4-multi-region@3.687.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/signature-v4': 4.2.0 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.637.0(@aws-sdk/client-sts@3.637.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.637.0(@aws-sdk/client-sts@3.637.0) - '@aws-sdk/types': 3.609.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/token-providers@3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) - '@aws-sdk/types': 3.686.0 - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/types@3.609.0': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/types@3.686.0': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@aws-sdk/util-arn-parser@3.679.0': - dependencies: - tslib: 2.7.0 - - '@aws-sdk/util-endpoints@3.637.0': - dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.6.0 - '@smithy/util-endpoints': 2.1.4 - tslib: 2.7.0 - - '@aws-sdk/util-endpoints@3.686.0': - dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - '@smithy/util-endpoints': 2.1.4 - tslib: 2.7.0 - - '@aws-sdk/util-format-url@3.686.0': + '@aws-sdk/types@3.901.0': dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.568.0': + '@aws-sdk/util-arn-parser@3.893.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.609.0': + '@aws-sdk/util-endpoints@3.901.0': dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/types': 3.6.0 - bowser: 2.11.0 - tslib: 2.7.0 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-endpoints': 3.2.0 + tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.686.0': + '@aws-sdk/util-locate-window@3.893.0': dependencies: - '@aws-sdk/types': 3.686.0 - '@smithy/types': 3.6.0 - bowser: 2.11.0 - tslib: 2.7.0 + tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.614.0': + '@aws-sdk/util-user-agent-browser@3.907.0': dependencies: - '@aws-sdk/types': 3.609.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@aws-sdk/types': 3.901.0 + '@smithy/types': 4.6.0 + bowser: 2.12.1 + tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.687.0': + '@aws-sdk/util-user-agent-node@3.908.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.687.0 - '@aws-sdk/types': 3.686.0 - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@aws-sdk/middleware-user-agent': 3.908.0 + '@aws-sdk/types': 3.901.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@aws-sdk/xml-builder@3.686.0': + '@aws-sdk/xml-builder@3.901.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 - '@axe-core/playwright@4.10.0(playwright-core@1.46.1)': - dependencies: - axe-core: 4.10.0 - playwright-core: 1.46.1 + '@aws/lambda-invoke-store@0.0.1': {} - '@babel/code-frame@7.24.7': + '@axe-core/playwright@4.10.2(playwright-core@1.56.0)': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + axe-core: 4.10.3 + playwright-core: 1.56.0 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 - picocolors: 1.1.0 - - '@babel/compat-data@7.25.4': {} - - '@babel/compat-data@7.26.2': {} - - '@babel/core@7.25.2': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.5 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.4 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 - convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@9.4.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.26.0': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.4': {} + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.5': - dependencies: - '@babel/types': 7.25.4 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/generator@7.26.2': - dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 - - '@babel/helper-annotate-as-pure@7.24.7': + '@babel/generator@7.28.3': dependencies: - '@babel/types': 7.25.4 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.25.2': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/types': 7.28.4 - '@babel/helper-compilation-targets@7.25.9': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.2 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + '@babel/compat-data': 7.28.4 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.26.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2)': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.4 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.26.0)': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.4 - semver: 6.3.1 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.24.8': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.22.15': - dependencies: - '@babel/types': 7.25.4 - - '@babel/helper-module-imports@7.24.7': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.28.4 - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/core': 7.28.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': - dependencies: - '@babel/types': 7.25.4 + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.4 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-replace-supers@7.25.0(@babel/core@7.26.0)': + '@babel/helpers@7.28.4': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.4 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 - '@babel/helper-simple-access@7.24.7': + '@babel/parser@7.28.4': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.28.4 - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option@7.24.8': {} + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option@7.25.9': {} + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helpers@7.25.0': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/helpers@7.26.0': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/highlight@7.24.7': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.25.4': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/types': 7.25.4 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.26.2': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/types': 7.26.0 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-decorators': 7.24.7(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.26.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.26.0)': + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@babel/traverse@7.28.4': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.26.0) + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/runtime@7.25.4': + '@babel/types@7.28.4': dependencies: - regenerator-runtime: 0.14.1 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - '@babel/standalone@7.25.5': {} + '@bcoe/v8-coverage@0.2.3': {} - '@babel/standalone@7.26.2': {} + '@borewit/text-codec@0.1.1': {} - '@babel/template@7.25.0': + '@clack/core@0.5.0': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 + picocolors: 1.1.1 + sisteransi: 1.0.5 - '@babel/template@7.25.9': + '@clack/prompts@0.11.0': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 - '@babel/traverse@7.25.4': + '@cloudflare/kv-asset-handler@0.4.0': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.5 - '@babel/parser': 7.25.4 - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 - debug: 4.3.7(supports-color@9.4.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + mime: 3.0.0 + + '@colors/colors@1.5.0': + optional: true - '@babel/traverse@7.25.9': + '@cspotcode/source-map-support@0.8.1': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@9.4.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@jridgewell/trace-mapping': 0.3.9 + + '@csstools/color-helpers@5.1.0': {} - '@babel/types@7.25.4': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@babel/types@7.26.0': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@cloudflare/kv-asset-handler@0.3.4': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - mime: 3.0.0 + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + + '@csstools/css-tokenizer@3.0.4': {} - '@docsearch/css@3.6.2': {} + '@docsearch/css@3.8.2': {} - '@docsearch/js@3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.0)': + '@docsearch/js@3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3)': dependencies: - '@docsearch/react': 3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.0) - preact: 10.23.2 + '@docsearch/react': 3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3) + preact: 10.27.2 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -10734,448 +10840,1091 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.0)': + '@docsearch/react@3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3)': dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0)(search-insights@2.17.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.24.0)(algoliasearch@4.24.0) - '@docsearch/css': 3.6.2 - algoliasearch: 4.24.0 + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.40.0)(algoliasearch@5.40.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.40.0 optionalDependencies: - search-insights: 2.17.0 + search-insights: 2.17.3 transitivePeerDependencies: - '@algolia/client-search' - '@es-joy/jsdoccomment@0.49.0': + '@emnapi/core@1.5.0': dependencies: - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 - - '@esbuild/aix-ppc64@0.21.5': + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.23.1': + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.24.0': + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-arm64@0.21.5': - optional: true + '@es-joy/jsdoccomment@0.56.0': + dependencies: + '@types/estree': 1.0.8 + '@typescript-eslint/types': 8.46.0 + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 5.1.1 - '@esbuild/android-arm64@0.23.1': + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.0': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm@0.24.0': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.0': + '@esbuild/android-x64@0.25.10': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.23.1': - optional: true - - '@esbuild/darwin-arm64@0.24.0': + '@esbuild/darwin-arm64@0.25.10': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.23.1': - optional: true - - '@esbuild/darwin-x64@0.24.0': + '@esbuild/darwin-x64@0.25.10': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.23.1': - optional: true - - '@esbuild/freebsd-arm64@0.24.0': + '@esbuild/freebsd-arm64@0.25.10': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.23.1': - optional: true - - '@esbuild/freebsd-x64@0.24.0': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.23.1': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/linux-arm64@0.24.0': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.0': + '@esbuild/linux-arm@0.25.10': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.23.1': - optional: true - - '@esbuild/linux-ia32@0.24.0': + '@esbuild/linux-ia32@0.25.10': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.23.1': - optional: true - - '@esbuild/linux-loong64@0.24.0': + '@esbuild/linux-loong64@0.25.10': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.23.1': - optional: true - - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/linux-mips64el@0.25.10': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.23.1': - optional: true - - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/linux-ppc64@0.25.10': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.23.1': - optional: true - - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-riscv64@0.25.10': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.23.1': - optional: true - - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-s390x@0.25.10': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/linux-x64@0.24.0': + '@esbuild/netbsd-arm64@0.25.10': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.23.1': - optional: true - - '@esbuild/netbsd-x64@0.24.0': - optional: true - - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/openbsd-arm64@0.25.10': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/openharmony-arm64@0.25.10': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.23.1': - optional: true - - '@esbuild/sunos-x64@0.24.0': + '@esbuild/sunos-x64@0.25.10': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.23.1': - optional: true - - '@esbuild/win32-arm64@0.24.0': + '@esbuild/win32-arm64@0.25.10': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.23.1': - optional: true - - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-ia32@0.25.10': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.23.1': - optional: true - - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.25.10': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.14.0(jiti@2.4.0))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))': dependencies: - eslint: 9.14.0(jiti@2.4.0) + eslint: 9.37.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.2(eslint@9.14.0(jiti@2.4.0))': + '@eslint/compat@1.4.0(eslint@9.37.0(jiti@2.6.1))': + dependencies: + '@eslint/core': 0.16.0 optionalDependencies: - eslint: 9.14.0(jiti@2.4.0) + eslint: 9.37.0(jiti@2.6.1) - '@eslint/config-array@0.18.0': + '@eslint/config-array@0.21.0': dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@9.4.0) + '@eslint/object-schema': 2.1.6 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.7.0': {} + '@eslint/config-helpers@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + + '@eslint/core@0.15.2': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.1.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@9.4.0) - espree: 10.3.0 + debug: 4.4.3 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.14.0': {} + '@eslint/js@9.37.0': {} + + '@eslint/object-schema@2.1.6': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/plugin-kit@0.3.5': + dependencies: + '@eslint/core': 0.15.2 + levn: 0.4.1 - '@eslint/plugin-kit@0.2.2': + '@eslint/plugin-kit@0.4.0': dependencies: + '@eslint/core': 0.16.0 levn: 0.4.1 - '@faker-js/faker@8.4.1': {} + '@faker-js/faker@10.0.0': {} - '@grpc/grpc-js@1.11.1': + '@fastify/error@4.2.0': {} + + '@grpc/grpc-js@1.14.0': dependencies: - '@grpc/proto-loader': 0.7.13 + '@grpc/proto-loader': 0.8.0 '@js-sdsl/ordered-map': 4.4.2 - '@grpc/proto-loader@0.7.13': - dependencies: - lodash.camelcase: 4.3.0 - long: 5.2.3 - protobufjs: 7.4.0 - yargs: 17.7.2 + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@hapi/address@5.1.1': + dependencies: + '@hapi/hoek': 11.0.7 + + '@hapi/formula@3.0.2': {} + + '@hapi/hoek@11.0.7': {} + + '@hapi/pinpoint@2.0.1': {} + + '@hapi/tlds@1.1.3': {} + + '@hapi/topo@6.0.2': + dependencies: + '@hapi/hoek': 11.0.7 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@iconify-json/simple-icons@1.2.54': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@inquirer/ansi@1.0.0': {} + + '@inquirer/checkbox@4.2.4(@types/node@24.7.2)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/confirm@5.1.18(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/core@10.2.2(@types/node@24.7.2)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.7.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.7.2 + + '@inquirer/editor@4.2.20(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/external-editor': 1.0.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/expand@4.0.20(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/external-editor@1.0.2(@types/node@24.7.2)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/input@4.2.4(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/number@3.0.20(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/password@4.0.20(@types/node@24.7.2)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/prompts@7.3.2(@types/node@24.7.2)': + dependencies: + '@inquirer/checkbox': 4.2.4(@types/node@24.7.2) + '@inquirer/confirm': 5.1.18(@types/node@24.7.2) + '@inquirer/editor': 4.2.20(@types/node@24.7.2) + '@inquirer/expand': 4.0.20(@types/node@24.7.2) + '@inquirer/input': 4.2.4(@types/node@24.7.2) + '@inquirer/number': 3.0.20(@types/node@24.7.2) + '@inquirer/password': 4.0.20(@types/node@24.7.2) + '@inquirer/rawlist': 4.1.8(@types/node@24.7.2) + '@inquirer/search': 3.1.3(@types/node@24.7.2) + '@inquirer/select': 4.3.4(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/prompts@7.8.0(@types/node@24.7.2)': + dependencies: + '@inquirer/checkbox': 4.2.4(@types/node@24.7.2) + '@inquirer/confirm': 5.1.18(@types/node@24.7.2) + '@inquirer/editor': 4.2.20(@types/node@24.7.2) + '@inquirer/expand': 4.0.20(@types/node@24.7.2) + '@inquirer/input': 4.2.4(@types/node@24.7.2) + '@inquirer/number': 3.0.20(@types/node@24.7.2) + '@inquirer/password': 4.0.20(@types/node@24.7.2) + '@inquirer/rawlist': 4.1.8(@types/node@24.7.2) + '@inquirer/search': 3.1.3(@types/node@24.7.2) + '@inquirer/select': 4.3.4(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/prompts@7.8.6(@types/node@24.7.2)': + dependencies: + '@inquirer/checkbox': 4.2.4(@types/node@24.7.2) + '@inquirer/confirm': 5.1.18(@types/node@24.7.2) + '@inquirer/editor': 4.2.20(@types/node@24.7.2) + '@inquirer/expand': 4.0.20(@types/node@24.7.2) + '@inquirer/input': 4.2.4(@types/node@24.7.2) + '@inquirer/number': 3.0.20(@types/node@24.7.2) + '@inquirer/password': 4.0.20(@types/node@24.7.2) + '@inquirer/rawlist': 4.1.8(@types/node@24.7.2) + '@inquirer/search': 3.1.3(@types/node@24.7.2) + '@inquirer/select': 4.3.4(@types/node@24.7.2) + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/rawlist@4.1.8(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/search@3.1.3(@types/node@24.7.2)': + dependencies: + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/select@4.3.4(@types/node@24.7.2)': + dependencies: + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.7.2) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.7.2 + + '@inquirer/type@3.0.8(@types/node@24.7.2)': + optionalDependencies: + '@types/node': 24.7.2 + + '@ioredis/commands@1.4.0': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@isaacs/string-locale-compare@1.1.0': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jercle/yargonaut@1.1.5': + dependencies: + chalk: 4.1.2 + figlet: 1.9.3 + parent-require: 1.0.0 + + '@jest/console@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + + '@jest/core@30.2.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))': + dependencies: + '@jest/console': 30.2.0 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 4.3.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-changed-files: 30.2.0 + jest-config: 30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-resolve-dependencies: 30.2.0 + jest-runner: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + jest-watcher: 30.2.0 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + '@jest/diff-sequences@30.0.1': {} + + '@jest/environment@30.2.0': + dependencies: + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + jest-mock: 30.2.0 + + '@jest/expect-utils@30.2.0': + dependencies: + '@jest/get-type': 30.1.0 + + '@jest/expect@30.2.0': + dependencies: + expect: 30.2.0 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 24.7.2 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + '@jest/get-type@30.1.0': {} + + '@jest/globals@30.2.0': + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/types': 30.2.0 + jest-mock: 30.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 24.7.2 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.2.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 24.7.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit-x: 0.2.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + jest-worker: 30.2.0 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.41 + + '@jest/snapshot-utils@30.2.0': + dependencies: + '@jest/types': 30.2.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.2.0': + dependencies: + '@jest/console': 30.2.0 + '@jest/types': 30.2.0 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@30.2.0': + dependencies: + '@jest/test-result': 30.2.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + slash: 3.0.0 + + '@jest/transform@30.2.0': + dependencies: + '@babel/core': 7.28.4 + '@jest/types': 30.2.0 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 7.0.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.7.2 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@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 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@jsdevtools/ono@7.1.3': {} + + '@kwsites/file-exists@1.1.1': + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@kwsites/promise-deferred@1.1.1': {} + + '@libsql/client@0.15.15': + dependencies: + '@libsql/core': 0.15.15 + '@libsql/hrana-client': 0.7.0 + js-base64: 3.7.8 + libsql: 0.5.22 + promise-limit: 2.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/core@0.15.15': + dependencies: + js-base64: 3.7.8 + + '@libsql/darwin-arm64@0.5.22': + optional: true + + '@libsql/darwin-x64@0.5.22': + optional: true + + '@libsql/hrana-client@0.7.0': + dependencies: + '@libsql/isomorphic-fetch': 0.3.1 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.8 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/isomorphic-fetch@0.3.1': {} + + '@libsql/isomorphic-ws@0.1.5': + dependencies: + '@types/ws': 8.18.1 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/linux-arm-gnueabihf@0.5.22': + optional: true + + '@libsql/linux-arm-musleabihf@0.5.22': + optional: true - '@hapi/boom@10.0.1': - dependencies: - '@hapi/hoek': 11.0.4 + '@libsql/linux-arm64-gnu@0.5.22': + optional: true - '@hapi/bourne@3.0.0': {} + '@libsql/linux-arm64-musl@0.5.22': + optional: true - '@hapi/hoek@11.0.4': {} + '@libsql/linux-x64-gnu@0.5.22': + optional: true - '@hapi/hoek@9.3.0': {} + '@libsql/linux-x64-musl@0.5.22': + optional: true - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 + '@libsql/win32-x64-msvc@0.5.22': + optional: true - '@hapi/wreck@18.1.0': - dependencies: - '@hapi/boom': 10.0.1 - '@hapi/bourne': 3.0.0 - '@hapi/hoek': 11.0.4 + '@logdna/tail-file@2.2.0': {} - '@humanfs/core@0.19.1': {} + '@lukeed/csprng@1.1.0': {} - '@humanfs/node@0.16.6': + '@mapbox/node-pre-gyp@2.0.0(encoding@0.1.13)': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 8.1.0 + semver: 7.7.3 + tar: 7.5.1 + transitivePeerDependencies: + - encoding + - supports-color - '@humanwhocodes/module-importer@1.0.1': {} + '@mdi/font@7.4.47': {} - '@humanwhocodes/retry@0.3.1': {} + '@microsoft/tsdoc@0.15.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@mikro-orm/cli@6.5.8(libsql@0.5.22)(pg@8.16.3)': + dependencies: + '@jercle/yargonaut': 1.1.5 + '@mikro-orm/core': 6.5.8 + '@mikro-orm/knex': 6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22)(pg@8.16.3) + fs-extra: 11.3.2 + tsconfig-paths: 4.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - better-sqlite3 + - libsql + - mariadb + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious - '@iconify-json/simple-icons@1.2.11': + '@mikro-orm/core@6.5.8': dependencies: - '@iconify/types': 2.0.0 + dataloader: 2.2.3 + dotenv: 17.2.3 + esprima: 4.0.1 + fs-extra: 11.3.2 + globby: 11.1.0 + mikro-orm: 6.5.8 + reflect-metadata: 0.2.2 - '@iconify/types@2.0.0': {} + '@mikro-orm/knex@6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22)(pg@8.16.3)': + dependencies: + '@mikro-orm/core': 6.5.8 + fs-extra: 11.3.2 + knex: 3.1.0(pg@8.16.3) + sqlstring: 2.3.3 + optionalDependencies: + libsql: 0.5.22 + transitivePeerDependencies: + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious - '@inquirer/core@9.0.10': + '@mikro-orm/libsql@6.5.8(@mikro-orm/core@6.5.8)(pg@8.16.3)': dependencies: - '@inquirer/figures': 1.0.5 - '@inquirer/type': 1.5.2 - '@types/mute-stream': 0.0.4 - '@types/node': 22.9.0 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - cli-spinners: 2.9.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + '@mikro-orm/core': 6.5.8 + '@mikro-orm/knex': 6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22)(pg@8.16.3) + fs-extra: 11.3.2 + libsql: 0.5.22 + sqlstring-sqlite: 0.1.1 + transitivePeerDependencies: + - better-sqlite3 + - mariadb + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious - '@inquirer/figures@1.0.5': {} + '@mikro-orm/migrations@6.5.8(@mikro-orm/core@6.5.8)(@types/node@24.7.2)(libsql@0.5.22)(pg@8.16.3)': + dependencies: + '@mikro-orm/core': 6.5.8 + '@mikro-orm/knex': 6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22)(pg@8.16.3) + fs-extra: 11.3.2 + umzug: 3.8.2(@types/node@24.7.2) + transitivePeerDependencies: + - '@types/node' + - better-sqlite3 + - libsql + - mariadb + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious - '@inquirer/select@2.4.7': + '@mikro-orm/nestjs@6.1.1(@mikro-orm/core@6.5.8)(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': dependencies: - '@inquirer/core': 9.0.10 - '@inquirer/figures': 1.0.5 - '@inquirer/type': 1.5.2 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.2 + '@mikro-orm/core': 6.5.8 + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) - '@inquirer/type@1.5.2': + '@mikro-orm/postgresql@6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22)': dependencies: - mute-stream: 1.0.0 + '@mikro-orm/core': 6.5.8 + '@mikro-orm/knex': 6.5.8(@mikro-orm/core@6.5.8)(libsql@0.5.22)(pg@8.16.3) + pg: 8.16.3 + postgres-array: 3.0.4 + postgres-date: 2.1.0 + postgres-interval: 4.0.2 + transitivePeerDependencies: + - better-sqlite3 + - libsql + - mariadb + - mysql + - mysql2 + - pg-native + - sqlite3 + - supports-color + - tedious - '@ioredis/commands@1.2.0': {} + '@mikro-orm/reflection@6.5.8(@mikro-orm/core@6.5.8)': + dependencies: + '@mikro-orm/core': 6.5.8 + globby: 11.1.0 + ts-morph: 27.0.2 - '@isaacs/cliui@8.0.2': + '@mikro-orm/seeder@6.5.8(@mikro-orm/core@6.5.8)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@mikro-orm/core': 6.5.8 + fs-extra: 11.3.2 + globby: 11.1.0 - '@isaacs/string-locale-compare@1.1.0': {} + '@mikro-orm/sql-highlighter@1.0.1': + dependencies: + ansi-colors: 4.1.3 - '@jridgewell/gen-mapping@0.3.5': + '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true - '@jridgewell/resolve-uri@3.1.2': {} + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true - '@jridgewell/set-array@1.2.1': {} + '@neon-rs/load@0.0.4': {} + + '@nestjs/cli@11.0.10(@types/node@24.7.2)': + dependencies: + '@angular-devkit/core': 19.2.15(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.15(chokidar@4.0.3) + '@angular-devkit/schematics-cli': 19.2.15(@types/node@24.7.2)(chokidar@4.0.3) + '@inquirer/prompts': 7.8.0(@types/node@24.7.2) + '@nestjs/schematics': 11.0.9(chokidar@4.0.3)(typescript@5.8.3) + ansis: 4.1.0 + chokidar: 4.0.3 + cli-table3: 0.6.5 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.8.3)(webpack@5.100.2) + glob: 11.0.3 + node-emoji: 1.11.0 + ora: 5.4.1 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tsconfig-paths-webpack-plugin: 4.2.0 + typescript: 5.8.3 + webpack: 5.100.2 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@types/node' + - esbuild + - uglify-js + - webpack-cli + + '@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + file-type: 21.0.0 + iterare: 1.2.1 + load-esm: 1.0.2 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + optionalDependencies: + class-transformer: 0.5.1 + class-validator: 0.14.2 + transitivePeerDependencies: + - supports-color - '@jridgewell/source-map@0.3.6': + '@nestjs/config@4.0.2(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.5.0': {} + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + dotenv: 16.4.7 + dotenv-expand: 12.0.1 + lodash: 4.17.21 + rxjs: 7.8.2 - '@jridgewell/trace-mapping@0.3.25': + '@nestjs/core@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(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.2.0 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) - '@js-sdsl/ordered-map@4.4.2': {} + '@nestjs/jwt@11.0.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))': + dependencies: + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@types/jsonwebtoken': 9.0.10 + jsonwebtoken: 9.0.2 - '@keyv/redis@3.0.1': + '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: - ioredis: 5.4.1 - transitivePeerDependencies: - - supports-color + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + reflect-metadata: 0.2.2 + optionalDependencies: + class-transformer: 0.5.1 + class-validator: 0.14.2 - '@keyv/serialize@1.0.1': + '@nestjs/passport@11.0.5(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)': dependencies: - buffer: 6.0.3 + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + passport: 0.7.0 - '@kwsites/file-exists@1.1.1': + '@nestjs/platform-express@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': dependencies: - debug: 4.3.7(supports-color@9.4.0) + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + cors: 2.8.5 + express: 5.1.0 + multer: 2.0.2 + path-to-regexp: 8.2.0 + tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@kwsites/promise-deferred@1.1.1': {} - - '@logdna/tail-file@2.2.0': {} + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.8.3)': + dependencies: + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 + jsonc-parser: 3.3.1 + pluralize: 8.0.0 + typescript: 5.8.3 + transitivePeerDependencies: + - chokidar - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': + '@nestjs/schematics@11.0.9(chokidar@4.0.3)(typescript@5.9.3)': dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0(encoding@0.1.13) - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.3 - tar: 6.2.1 + '@angular-devkit/core': 19.2.17(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.17(chokidar@4.0.3) + comment-json: 4.4.1 + jsonc-parser: 3.3.1 + pluralize: 8.0.0 + typescript: 5.9.3 transitivePeerDependencies: - - encoding - - supports-color + - chokidar - '@mdi/font@7.4.47': {} + '@nestjs/serve-static@5.0.4(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(express@5.1.0)': + dependencies: + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + path-to-regexp: 8.3.0 + optionalDependencies: + express: 5.1.0 - '@netlify/functions@2.8.2': + '@nestjs/swagger@11.2.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)': dependencies: - '@netlify/serverless-functions-api': 1.26.1 + '@microsoft/tsdoc': 0.15.1 + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2) + js-yaml: 4.1.0 + lodash: 4.17.21 + path-to-regexp: 8.2.0 + reflect-metadata: 0.2.2 + swagger-ui-dist: 5.21.0 + optionalDependencies: + class-transformer: 0.5.1 + class-validator: 0.14.2 - '@netlify/node-cookies@0.1.0': {} + '@nestjs/testing@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(@nestjs/platform-express@11.1.6)': + dependencies: + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + tslib: 2.8.1 + optionalDependencies: + '@nestjs/platform-express': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6) - '@netlify/serverless-functions-api@1.26.1': + '@nestjs/throttler@6.4.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)(reflect-metadata@0.2.2)': dependencies: - '@netlify/node-cookies': 0.1.0 - urlpattern-polyfill: 8.0.2 + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + reflect-metadata: 0.2.2 - '@noble/hashes@1.4.0': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -11187,15 +11936,15 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@npmcli/agent@2.2.2': dependencies: - agent-base: 7.1.1(supports-color@9.4.0) + agent-base: 7.1.4 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5(supports-color@9.4.0) + https-proxy-agent: 7.0.6 lru-cache: 10.4.3 - socks-proxy-agent: 8.0.4 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color @@ -11208,7 +11957,7 @@ snapshots: '@npmcli/metavuln-calculator': 7.1.1 '@npmcli/name-from-folder': 2.0.0 '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.0 + '@npmcli/package-json': 5.2.1 '@npmcli/query': 3.1.0 '@npmcli/redact': 2.0.1 '@npmcli/run-script': 8.1.0 @@ -11230,9 +11979,9 @@ snapshots: proc-log: 4.2.0 proggy: 2.0.0 promise-all-reject-late: 1.0.1 - promise-call-limit: 3.0.1 + promise-call-limit: 3.0.2 read-package-json-fast: 3.0.2 - semver: 7.6.3 + semver: 7.7.3 ssri: 10.0.6 treeverse: 3.0.0 walk-up-path: 3.0.1 @@ -11242,7 +11991,7 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.6.3 + semver: 7.7.3 '@npmcli/git@5.0.8': dependencies: @@ -11253,7 +12002,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.6.3 + semver: 7.7.3 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -11276,7 +12025,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.3 transitivePeerDependencies: - bluebird - supports-color @@ -11285,7 +12034,7 @@ snapshots: '@npmcli/node-gyp@3.0.0': {} - '@npmcli/package-json@5.2.0': + '@npmcli/package-json@5.2.1': dependencies: '@npmcli/git': 5.0.8 glob: 10.4.5 @@ -11293,7 +12042,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.3 transitivePeerDependencies: - bluebird @@ -11310,604 +12059,894 @@ snapshots: '@npmcli/run-script@8.1.0': dependencies: '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.0 + '@npmcli/package-json': 5.2.1 '@npmcli/promise-spawn': 7.0.2 - node-gyp: 10.2.0 + node-gyp: 10.3.1 proc-log: 4.2.0 which: 4.0.0 transitivePeerDependencies: - - bluebird + - bluebird + - supports-color + + '@nuxt/cli@3.29.3(magicast@0.3.5)': + dependencies: + c12: 3.3.0(magicast@0.3.5) + citty: 0.1.6 + clipboardy: 5.0.0 + confbox: 0.2.2 + consola: 3.4.2 + defu: 6.1.4 + exsolve: 1.0.7 + fuse.js: 7.1.0 + get-port-please: 3.2.0 + giget: 2.0.0 + h3: 1.15.4 + jiti: 2.6.1 + listhen: 1.9.0 + nypm: 0.6.2 + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + scule: 1.3.0 + semver: 7.7.3 + srvx: 0.8.16 + std-env: 3.9.0 + tinyexec: 1.0.1 + ufo: 1.6.1 + undici: 7.16.0 + youch: 4.1.0-beta.11 + transitivePeerDependencies: + - magicast + + '@nuxt/devalue@2.0.2': {} + + '@nuxt/devtools-kit@2.6.5(magicast@0.3.5)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@nuxt/kit': 3.19.3(magicast@0.3.5) + execa: 8.0.1 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + transitivePeerDependencies: + - magicast + + '@nuxt/devtools-wizard@2.6.5': + dependencies: + consola: 3.4.2 + diff: 8.0.2 + execa: 8.0.1 + magicast: 0.3.5 + pathe: 2.0.3 + pkg-types: 2.3.0 + prompts: 2.4.2 + semver: 7.7.3 + + '@nuxt/devtools@2.6.5(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@nuxt/devtools-kit': 2.6.5(magicast@0.3.5)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + '@nuxt/devtools-wizard': 2.6.5 + '@nuxt/kit': 3.19.3(magicast@0.3.5) + '@vue/devtools-core': 7.7.7(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + '@vue/devtools-kit': 7.7.7 + birpc: 2.6.1 + consola: 3.4.2 + destr: 2.0.5 + error-stack-parser-es: 1.0.5 + execa: 8.0.1 + fast-npm-meta: 0.4.7 + get-port-please: 3.2.0 + hookable: 5.5.3 + image-meta: 0.2.2 + is-installed-globally: 1.0.0 + launch-editor: 2.11.1 + local-pkg: 1.1.2 + magicast: 0.3.5 + nypm: 0.6.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.3.0 + semver: 7.7.3 + simple-git: 3.28.0 + sirv: 3.0.2 + structured-clone-es: 1.0.0 + tinyglobby: 0.2.15 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.3(magicast@0.3.5))(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + vite-plugin-vue-tracer: 1.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + which: 5.0.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + - vue + + '@nuxt/eslint-config@1.9.0(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@clack/prompts': 0.11.0 + '@eslint/js': 9.37.0 + '@nuxt/eslint-plugin': 1.9.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.4.0(eslint@9.37.0(jiti@2.6.1)) + '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + eslint-config-flat-gitignore: 2.1.0(eslint@9.37.0(jiti@2.6.1)) + eslint-flat-config-utils: 2.1.4 + eslint-merge-processors: 2.0.0(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-import-lite: 0.3.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-jsdoc: 54.7.0(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-regexp: 2.10.0(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-unicorn: 60.0.0(eslint@9.37.0(jiti@2.6.1)) + eslint-plugin-vue: 10.5.0(@stylistic/eslint-plugin@5.4.0(eslint@9.37.0(jiti@2.6.1)))(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.37.0(jiti@2.6.1))) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.22)(eslint@9.37.0(jiti@2.6.1)) + globals: 16.4.0 + local-pkg: 1.1.2 + pathe: 2.0.3 + vue-eslint-parser: 10.2.0(eslint@9.37.0(jiti@2.6.1)) + transitivePeerDependencies: + - '@typescript-eslint/utils' + - '@vue/compiler-sfc' + - eslint-import-resolver-node + - supports-color + - typescript + + '@nuxt/eslint-plugin@1.9.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + transitivePeerDependencies: + - supports-color + - typescript + + '@nuxt/kit@3.19.3(magicast@0.3.5)': + dependencies: + c12: 3.3.0(magicast@0.3.5) + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.7 + ignore: 7.0.5 + jiti: 2.6.1 + klona: 2.0.6 + knitwork: 1.2.0 + mlly: 1.8.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.0 + rc9: 2.1.2 + scule: 1.3.0 + semver: 7.7.3 + std-env: 3.9.0 + tinyglobby: 0.2.15 + ufo: 1.6.1 + unctx: 2.4.1 + unimport: 5.4.1 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + + '@nuxt/kit@4.1.2(magicast@0.3.5)': + dependencies: + c12: 3.3.0(magicast@0.3.5) + consola: 3.4.2 + defu: 6.1.4 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.0.7 + ignore: 7.0.5 + jiti: 2.6.1 + klona: 2.0.6 + mlly: 1.8.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.0 + rc9: 2.1.2 + scule: 1.3.0 + semver: 7.7.3 + std-env: 3.9.0 + tinyglobby: 0.2.15 + ufo: 1.6.1 + unctx: 2.4.1 + unimport: 5.4.1 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + + '@nuxt/opencollective@0.4.1': + dependencies: + consola: 3.4.2 + + '@nuxt/schema@4.1.2': + dependencies: + '@vue/shared': 3.5.22 + consola: 3.4.2 + defu: 6.1.4 + pathe: 2.0.3 + pkg-types: 2.3.0 + std-env: 3.9.0 + ufo: 1.6.1 + + '@nuxt/telemetry@2.6.6(magicast@0.3.5)': + dependencies: + '@nuxt/kit': 3.19.3(magicast@0.3.5) + citty: 0.1.6 + consola: 3.4.2 + destr: 2.0.5 + dotenv: 16.6.1 + git-url-parse: 16.1.0 + is-docker: 3.0.0 + ofetch: 1.4.1 + package-manager-detector: 1.4.0 + pathe: 2.0.3 + rc9: 2.1.2 + std-env: 3.9.0 + transitivePeerDependencies: + - magicast + + '@nuxt/vite-builder@4.1.2(@types/node@24.7.2)(eslint@9.37.0(jiti@2.6.1))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.4)(sass@1.93.2)(terser@5.44.0)(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))(yaml@2.8.1)': + dependencies: + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.4) + '@vitejs/plugin-vue': 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + autoprefixer: 10.4.21(postcss@8.5.6) + consola: 3.4.2 + cssnano: 7.1.1(postcss@8.5.6) + defu: 6.1.4 + esbuild: 0.25.10 + escape-string-regexp: 5.0.0 + exsolve: 1.0.7 + get-port-please: 3.2.0 + h3: 1.15.4 + jiti: 2.6.1 + knitwork: 1.2.0 + magic-string: 0.30.19 + mlly: 1.8.0 + mocked-exports: 0.1.1 + pathe: 2.0.3 + pkg-types: 2.3.0 + postcss: 8.5.6 + rollup-plugin-visualizer: 6.0.4(rollup@4.52.4) + std-env: 3.9.0 + ufo: 1.6.1 + unenv: 2.0.0-rc.21 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-checker: 0.10.3(eslint@9.37.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) + vue-bundle-renderer: 2.2.0 + transitivePeerDependencies: + - '@biomejs/biome' + - '@types/node' + - eslint + - less + - lightningcss + - magicast + - meow + - optionator + - rolldown + - rollup + - sass + - sass-embedded + - stylelint + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - vls + - vti + - vue-tsc + - yaml + + '@nuxtjs/google-fonts@3.2.0(magicast@0.3.5)': + dependencies: + '@nuxt/kit': 3.19.3(magicast@0.3.5) + google-fonts-helper: 3.7.3 + pathe: 1.1.2 + transitivePeerDependencies: + - magicast + + '@opentelemetry/api-logs@0.204.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api-logs@0.55.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api-logs@0.57.2': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/exporter-zipkin@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/instrumentation-amqplib@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.48.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.22.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: - supports-color - '@nuxt/devalue@2.0.2': {} + '@opentelemetry/instrumentation-express@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color - '@nuxt/devtools-kit@1.3.14(magicast@0.3.4)(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-fs@0.24.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@4.24.4)(webpack-sources@3.2.3) - '@nuxt/schema': 3.13.0(rollup@4.24.4) - execa: 7.2.0 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@nuxt/devtools-kit@1.6.0(magicast@0.3.5)(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-generic-pool@0.48.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/kit': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - '@nuxt/schema': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - execa: 7.2.0 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@nuxt/devtools-wizard@1.3.14': + '@opentelemetry/instrumentation-graphql@0.52.0(@opentelemetry/api@1.9.0)': dependencies: - consola: 3.2.3 - diff: 5.2.0 - execa: 7.2.0 - global-directory: 4.0.1 - magicast: 0.3.4 - pathe: 1.1.2 - pkg-types: 1.2.0 - prompts: 2.4.2 - rc9: 2.1.2 - semver: 7.6.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color - '@nuxt/devtools-wizard@1.6.0': + '@opentelemetry/instrumentation-grpc@0.55.0(@opentelemetry/api@1.9.0)': dependencies: - consola: 3.2.3 - diff: 7.0.0 - execa: 7.2.0 - global-directory: 4.0.1 - magicast: 0.3.5 - pathe: 1.1.2 - pkg-types: 1.2.1 - prompts: 2.4.2 - rc9: 2.1.2 - semver: 7.6.3 - - '@nuxt/devtools@1.3.14(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(webpack-sources@3.2.3)': - dependencies: - '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.3.14(magicast@0.3.4)(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(webpack-sources@3.2.3) - '@nuxt/devtools-wizard': 1.3.14 - '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@4.24.4)(webpack-sources@3.2.3) - '@vue/devtools-core': 7.3.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - '@vue/devtools-kit': 7.3.3 - birpc: 0.2.17 - consola: 3.2.3 - cronstrue: 2.50.0 - destr: 2.0.3 - error-stack-parser-es: 0.1.5 - execa: 7.2.0 - fast-glob: 3.3.2 - fast-npm-meta: 0.2.2 - flatted: 3.3.1 - get-port-please: 3.1.2 - hookable: 5.5.3 - image-meta: 0.2.1 - is-installed-globally: 1.0.0 - launch-editor: 2.8.1 - local-pkg: 0.5.0 - magicast: 0.3.4 - nypm: 0.3.11 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.0 - rc9: 2.1.2 - scule: 1.3.0 - semver: 7.6.3 - simple-git: 3.25.0 - sirv: 2.0.4 - unimport: 3.11.1(rollup@4.24.4) - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.13.0(magicast@0.3.4)(rollup@4.24.4)(webpack-sources@3.2.3))(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - vite-plugin-vue-inspector: 5.1.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - which: 3.0.1 - ws: 8.18.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - - bufferutil - - rollup - supports-color - - utf-8-validate - - webpack-sources - - '@nuxt/devtools@1.6.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': - dependencies: - '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.6.0(magicast@0.3.5)(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(webpack-sources@3.2.3) - '@nuxt/devtools-wizard': 1.6.0 - '@nuxt/kit': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - '@vue/devtools-core': 7.4.4(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - '@vue/devtools-kit': 7.4.4 - birpc: 0.2.19 - consola: 3.2.3 - cronstrue: 2.50.0 - destr: 2.0.3 - error-stack-parser-es: 0.1.5 - execa: 7.2.0 - fast-npm-meta: 0.2.2 - flatted: 3.3.1 - get-port-please: 3.1.2 - hookable: 5.5.3 - image-meta: 0.2.1 - is-installed-globally: 1.0.0 - launch-editor: 2.9.1 - local-pkg: 0.5.0 - magicast: 0.3.5 - nypm: 0.3.12 - ohash: 1.1.4 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.1 - rc9: 2.1.2 - scule: 1.3.0 - semver: 7.6.3 - simple-git: 3.27.0 - sirv: 2.0.4 - tinyglobby: 0.2.10 - unimport: 3.13.1(rollup@4.24.4)(webpack-sources@3.2.3) - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vite-plugin-inspect: 0.8.7(@nuxt/kit@3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3))(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - vite-plugin-vue-inspector: 5.1.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - which: 3.0.1 - ws: 8.18.0 + + '@opentelemetry/instrumentation-hapi@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - - bufferutil - - rollup - supports-color - - utf-8-validate - - vue - - webpack-sources - - '@nuxt/eslint-config@0.6.1(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': - dependencies: - '@eslint/js': 9.14.0 - '@nuxt/eslint-plugin': 0.6.1(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - '@stylistic/eslint-plugin': 2.10.1(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - eslint: 9.14.0(jiti@2.4.0) - eslint-config-flat-gitignore: 0.3.0(eslint@9.14.0(jiti@2.4.0)) - eslint-flat-config-utils: 0.4.0 - eslint-plugin-import-x: 4.4.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - eslint-plugin-jsdoc: 50.4.3(eslint@9.14.0(jiti@2.4.0)) - eslint-plugin-regexp: 2.6.0(eslint@9.14.0(jiti@2.4.0)) - eslint-plugin-unicorn: 56.0.0(eslint@9.14.0(jiti@2.4.0)) - eslint-plugin-vue: 9.30.0(eslint@9.14.0(jiti@2.4.0)) - globals: 15.12.0 - local-pkg: 0.5.0 - pathe: 1.1.2 - vue-eslint-parser: 9.4.3(eslint@9.14.0(jiti@2.4.0)) + + '@opentelemetry/instrumentation-http@0.204.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color - - typescript - '@nuxt/eslint-plugin@0.6.1(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@opentelemetry/instrumentation-ioredis@0.52.0(@opentelemetry/api@1.9.0)': dependencies: - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - eslint: 9.14.0(jiti@2.4.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - supports-color - - typescript - '@nuxt/kit@3.13.0(magicast@0.3.4)(rollup@4.24.4)(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-kafkajs@0.14.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/schema': 3.13.0(rollup@4.24.4) - c12: 1.11.1(magicast@0.3.4) - consola: 3.2.3 - defu: 6.1.4 - destr: 2.0.3 - globby: 14.0.2 - hash-sum: 2.0.0 - ignore: 5.3.2 - jiti: 1.21.6 - klona: 2.0.6 - knitwork: 1.1.0 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - scule: 1.3.0 - semver: 7.6.3 - ufo: 1.5.4 - unctx: 2.3.1(webpack-sources@3.2.3) - unimport: 3.11.1(rollup@4.24.4) - untyped: 1.4.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@nuxt/kit@3.13.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-knex@0.49.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/schema': 3.13.0(rollup@4.24.4) - c12: 1.11.1(magicast@0.3.5) - consola: 3.2.3 - defu: 6.1.4 - destr: 2.0.3 - globby: 14.0.2 - hash-sum: 2.0.0 - ignore: 5.3.2 - jiti: 1.21.6 - klona: 2.0.6 - knitwork: 1.1.0 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - scule: 1.3.0 - semver: 7.6.3 - ufo: 1.5.4 - unctx: 2.3.1(webpack-sources@3.2.3) - unimport: 3.11.1(rollup@4.24.4) - untyped: 1.4.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@nuxt/kit@3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-koa@0.52.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/schema': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - c12: 2.0.1(magicast@0.3.5) - consola: 3.2.3 - defu: 6.1.4 - destr: 2.0.3 - globby: 14.0.2 - hash-sum: 2.0.0 - ignore: 6.0.2 - jiti: 2.4.0 - klona: 2.0.6 - knitwork: 1.1.0 - mlly: 1.7.2 - pathe: 1.1.2 - pkg-types: 1.2.1 - scule: 1.3.0 - semver: 7.6.3 - ufo: 1.5.4 - unctx: 2.3.1(webpack-sources@3.2.3) - unimport: 3.13.1(rollup@4.24.4)(webpack-sources@3.2.3) - untyped: 1.5.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@nuxt/schema@3.13.0(rollup@4.24.4)': + '@opentelemetry/instrumentation-lru-memoizer@0.49.0(@opentelemetry/api@1.9.0)': dependencies: - compatx: 0.1.8 - consola: 3.2.3 - defu: 6.1.4 - hookable: 5.5.3 - pathe: 1.1.2 - pkg-types: 1.2.0 - scule: 1.3.0 - std-env: 3.7.0 - ufo: 1.5.4 - uncrypto: 0.1.3 - unimport: 3.11.1(rollup@4.24.4) - untyped: 1.4.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - - rollup - supports-color - '@nuxt/schema@3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-mongodb@0.57.0(@opentelemetry/api@1.9.0)': dependencies: - c12: 2.0.1(magicast@0.3.5) - compatx: 0.1.8 - consola: 3.2.3 - defu: 6.1.4 - hookable: 5.5.3 - pathe: 1.1.2 - pkg-types: 1.2.1 - scule: 1.3.0 - std-env: 3.7.0 - ufo: 1.5.4 - uncrypto: 0.1.3 - unimport: 3.13.1(rollup@4.24.4)(webpack-sources@3.2.3) - untyped: 1.5.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@nuxt/telemetry@2.6.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-mongoose@0.51.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/kit': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - ci-info: 4.0.0 - consola: 3.2.3 - create-require: 1.1.1 - defu: 6.1.4 - destr: 2.0.3 - dotenv: 16.4.5 - git-url-parse: 15.0.0 - is-docker: 3.0.0 - jiti: 1.21.6 - mri: 1.2.0 - nanoid: 5.0.7 - ofetch: 1.4.1 - package-manager-detector: 0.2.2 - parse-git-config: 3.0.0 - pathe: 1.1.2 - rc9: 2.1.2 - std-env: 3.7.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - - '@nuxt/vite-builder@3.13.0(@types/node@22.9.0)(eslint@9.14.0(jiti@2.4.0))(magicast@0.3.5)(meow@10.1.5)(optionator@0.9.4)(rollup@4.24.4)(sass@1.79.5)(terser@5.36.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': - dependencies: - '@nuxt/kit': 3.13.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - '@rollup/plugin-replace': 5.0.7(rollup@4.24.4) - '@vitejs/plugin-vue': 5.1.4(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - '@vitejs/plugin-vue-jsx': 4.0.1(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - autoprefixer: 10.4.20(postcss@8.4.47) - clear: 0.1.0 - consola: 3.2.3 - cssnano: 7.0.6(postcss@8.4.47) - defu: 6.1.4 - esbuild: 0.23.1 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - externality: 1.0.2 - get-port-please: 3.1.2 - h3: 1.13.0 - knitwork: 1.1.0 - magic-string: 0.30.12 - mlly: 1.7.2 - ohash: 1.1.4 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.1 - postcss: 8.4.47 - rollup-plugin-visualizer: 5.12.0(rollup@4.24.4) - std-env: 3.7.0 - strip-literal: 2.1.0 - ufo: 1.5.4 - unenv: 1.10.0 - unplugin: 1.15.0(webpack-sources@3.2.3) - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vite-node: 2.1.4(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vite-plugin-checker: 0.7.2(eslint@9.14.0(jiti@2.4.0))(meow@10.1.5)(optionator@0.9.4)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue-tsc@2.1.6(typescript@5.6.3)) - vue: 3.5.12(typescript@5.6.3) - vue-bundle-renderer: 2.1.1 + + '@opentelemetry/instrumentation-mysql2@0.51.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) transitivePeerDependencies: - - '@biomejs/biome' - - '@types/node' - - eslint - - less - - lightningcss - - magicast - - meow - - optionator - - rollup - - sass - - sass-embedded - - stylelint - - stylus - - sugarss - supports-color - - terser - - typescript - - vls - - vti - - vue-tsc - - webpack-sources - '@nuxtjs/google-fonts@3.2.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3)': + '@opentelemetry/instrumentation-mysql@0.50.0(@opentelemetry/api@1.9.0)': dependencies: - '@nuxt/kit': 3.13.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - google-fonts-helper: 3.6.0 - pathe: 1.1.2 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/mysql': 2.15.27 transitivePeerDependencies: - - magicast - - rollup - supports-color - - webpack-sources - '@one-ini/wasm@0.1.1': {} + '@opentelemetry/instrumentation-nestjs-core@0.50.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color - '@opentelemetry/api-logs@0.52.1': + '@opentelemetry/instrumentation-pg@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + '@types/pg': 8.15.5 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color - '@opentelemetry/api@1.9.0': {} + '@opentelemetry/instrumentation-redis@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color - '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-tedious@0.23.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color - '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-undici@0.15.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color - '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/api-logs': 0.204.0 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + transitivePeerDependencies: + - supports-color - '@opentelemetry/instrumentation-grpc@0.52.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/api-logs': 0.55.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + semver: 7.7.3 + shimmer: 1.2.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/api-logs': 0.57.2 '@types/shimmer': 1.2.0 - import-in-the-middle: 1.11.0 - require-in-the-middle: 7.4.0 - semver: 7.6.3 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + semver: 7.7.3 shimmer: 1.2.1 transitivePeerDependencies: - supports-color - '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/redis-common@0.38.2': {} + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + semver: 7.7.3 + + '@opentelemetry/semantic-conventions@1.27.0': {} + + '@opentelemetry/semantic-conventions@1.28.0': {} - '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/semantic-conventions@1.37.0': {} + + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + + '@oxc-minify/binding-android-arm64@0.87.0': + optional: true + + '@oxc-minify/binding-darwin-arm64@0.87.0': + optional: true + + '@oxc-minify/binding-darwin-x64@0.87.0': + optional: true + + '@oxc-minify/binding-freebsd-x64@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm-gnueabihf@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm-musleabihf@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm64-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-arm64-musl@0.87.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-s390x-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-x64-gnu@0.87.0': + optional: true + + '@oxc-minify/binding-linux-x64-musl@0.87.0': + optional: true + + '@oxc-minify/binding-wasm32-wasi@0.87.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-minify/binding-win32-arm64-msvc@0.87.0': + optional: true + + '@oxc-minify/binding-win32-x64-msvc@0.87.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.87.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.87.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.87.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.87.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.87.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.87.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.87.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.87.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.87.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.87.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.87.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.87.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.87.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.87.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.87.0': + optional: true + + '@oxc-project/types@0.87.0': {} + + '@oxc-transform/binding-android-arm64@0.87.0': + optional: true + + '@oxc-transform/binding-darwin-arm64@0.87.0': + optional: true + + '@oxc-transform/binding-darwin-x64@0.87.0': + optional: true + + '@oxc-transform/binding-freebsd-x64@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm-gnueabihf@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm-musleabihf@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm64-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-arm64-musl@0.87.0': + optional: true + + '@oxc-transform/binding-linux-riscv64-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-s390x-gnu@0.87.0': + optional: true - '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 + '@oxc-transform/binding-linux-x64-gnu@0.87.0': + optional: true + + '@oxc-transform/binding-linux-x64-musl@0.87.0': + optional: true - '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': + '@oxc-transform/binding-wasm32-wasi@0.87.0': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - semver: 7.6.3 + '@napi-rs/wasm-runtime': 1.0.7 + optional: true - '@opentelemetry/semantic-conventions@1.25.1': {} + '@oxc-transform/binding-win32-arm64-msvc@0.87.0': + optional: true - '@opentelemetry/semantic-conventions@1.26.0': {} + '@oxc-transform/binding-win32-x64-msvc@0.87.0': + optional: true '@paralleldrive/cuid2@2.2.2': dependencies: - '@noble/hashes': 1.4.0 + '@noble/hashes': 1.8.0 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true - '@parcel/watcher-android-arm64@2.4.1': + '@parcel/watcher-darwin-arm64@2.5.1': optional: true - '@parcel/watcher-darwin-arm64@2.4.1': + '@parcel/watcher-darwin-x64@2.5.1': optional: true - '@parcel/watcher-darwin-x64@2.4.1': + '@parcel/watcher-freebsd-x64@2.5.1': optional: true - '@parcel/watcher-freebsd-x64@2.4.1': + '@parcel/watcher-linux-arm-glibc@2.5.1': optional: true - '@parcel/watcher-linux-arm-glibc@2.4.1': + '@parcel/watcher-linux-arm-musl@2.5.1': optional: true - '@parcel/watcher-linux-arm64-glibc@2.4.1': + '@parcel/watcher-linux-arm64-glibc@2.5.1': optional: true - '@parcel/watcher-linux-arm64-musl@2.4.1': + '@parcel/watcher-linux-arm64-musl@2.5.1': optional: true - '@parcel/watcher-linux-x64-glibc@2.4.1': + '@parcel/watcher-linux-x64-glibc@2.5.1': optional: true - '@parcel/watcher-linux-x64-musl@2.4.1': + '@parcel/watcher-linux-x64-musl@2.5.1': optional: true - '@parcel/watcher-wasm@2.4.1': + '@parcel/watcher-wasm@2.5.1': dependencies: is-glob: 4.0.3 micromatch: 4.0.8 - '@parcel/watcher-win32-arm64@2.4.1': + '@parcel/watcher-win32-arm64@2.5.1': optional: true - '@parcel/watcher-win32-ia32@2.4.1': + '@parcel/watcher-win32-ia32@2.5.1': optional: true - '@parcel/watcher-win32-x64@2.4.1': + '@parcel/watcher-win32-x64@2.5.1': optional: true - '@parcel/watcher@2.4.1': + '@parcel/watcher@2.5.1': dependencies: detect-libc: 1.0.3 is-glob: 4.0.3 micromatch: 4.0.8 node-addon-api: 7.1.1 optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 - - '@percy/cli-app@1.30.1(typescript@5.6.3)': - dependencies: - '@percy/cli-command': 1.30.1(typescript@5.6.3) - '@percy/cli-exec': 1.30.1(typescript@5.6.3) + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + + '@percy/cli-app@1.31.3(typescript@5.9.3)': + dependencies: + '@percy/cli-command': 1.31.3(typescript@5.9.3) + '@percy/cli-exec': 1.31.3(typescript@5.9.3) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-build@1.30.1(typescript@5.6.3)': + '@percy/cli-build@1.31.3(typescript@5.9.3)': dependencies: - '@percy/cli-command': 1.30.1(typescript@5.6.3) + '@percy/cli-command': 1.31.3(typescript@5.9.3) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-command@1.30.1(typescript@5.6.3)': + '@percy/cli-command@1.31.3(typescript@5.9.3)': dependencies: - '@percy/config': 1.30.1(typescript@5.6.3) - '@percy/core': 1.30.1(typescript@5.6.3) - '@percy/logger': 1.30.1 + '@percy/config': 1.31.3(typescript@5.9.3) + '@percy/core': 1.31.3(typescript@5.9.3) + '@percy/logger': 1.31.3 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-config@1.30.1(typescript@5.6.3)': + '@percy/cli-config@1.31.3(typescript@5.9.3)': dependencies: - '@percy/cli-command': 1.30.1(typescript@5.6.3) + '@percy/cli-command': 1.31.3(typescript@5.9.3) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-exec@1.30.1(typescript@5.6.3)': + '@percy/cli-exec@1.31.3(typescript@5.9.3)': dependencies: - '@percy/cli-command': 1.30.1(typescript@5.6.3) - '@percy/logger': 1.30.1 - cross-spawn: 7.0.3 + '@percy/cli-command': 1.31.3(typescript@5.9.3) + '@percy/logger': 1.31.3 + cross-spawn: 7.0.6 which: 2.0.2 transitivePeerDependencies: - bufferutil @@ -11915,130 +12954,164 @@ snapshots: - typescript - utf-8-validate - '@percy/cli-snapshot@1.30.1(typescript@5.6.3)': + '@percy/cli-snapshot@1.31.3(typescript@5.9.3)': dependencies: - '@percy/cli-command': 1.30.1(typescript@5.6.3) - yaml: 2.5.0 + '@percy/cli-command': 1.31.3(typescript@5.9.3) + yaml: 2.8.1 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli-upload@1.30.1(typescript@5.6.3)': + '@percy/cli-upload@1.31.3(typescript@5.9.3)': dependencies: - '@percy/cli-command': 1.30.1(typescript@5.6.3) - fast-glob: 3.3.2 - image-size: 1.1.1 + '@percy/cli-command': 1.31.3(typescript@5.9.3) + fast-glob: 3.3.3 + image-size: 1.2.1 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/cli@1.30.1(typescript@5.6.3)': - dependencies: - '@percy/cli-app': 1.30.1(typescript@5.6.3) - '@percy/cli-build': 1.30.1(typescript@5.6.3) - '@percy/cli-command': 1.30.1(typescript@5.6.3) - '@percy/cli-config': 1.30.1(typescript@5.6.3) - '@percy/cli-exec': 1.30.1(typescript@5.6.3) - '@percy/cli-snapshot': 1.30.1(typescript@5.6.3) - '@percy/cli-upload': 1.30.1(typescript@5.6.3) - '@percy/client': 1.30.1 - '@percy/logger': 1.30.1 + '@percy/cli@1.31.3(typescript@5.9.3)': + dependencies: + '@percy/cli-app': 1.31.3(typescript@5.9.3) + '@percy/cli-build': 1.31.3(typescript@5.9.3) + '@percy/cli-command': 1.31.3(typescript@5.9.3) + '@percy/cli-config': 1.31.3(typescript@5.9.3) + '@percy/cli-exec': 1.31.3(typescript@5.9.3) + '@percy/cli-snapshot': 1.31.3(typescript@5.9.3) + '@percy/cli-upload': 1.31.3(typescript@5.9.3) + '@percy/client': 1.31.3(typescript@5.9.3) + '@percy/logger': 1.31.3 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/client@1.30.1': + '@percy/client@1.31.3(typescript@5.9.3)': dependencies: - '@percy/env': 1.30.1 - '@percy/logger': 1.30.1 + '@percy/config': 1.31.3(typescript@5.9.3) + '@percy/env': 1.31.3 + '@percy/logger': 1.31.3 + pac-proxy-agent: 7.2.0 pako: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript - '@percy/config@1.30.1(typescript@5.6.3)': + '@percy/config@1.31.3(typescript@5.9.3)': dependencies: - '@percy/logger': 1.30.1 + '@percy/logger': 1.31.3 ajv: 8.17.1 - cosmiconfig: 8.3.6(typescript@5.6.3) - yaml: 2.5.0 + cosmiconfig: 8.3.6(typescript@5.9.3) + yaml: 2.8.1 transitivePeerDependencies: - typescript - '@percy/core@1.30.1(typescript@5.6.3)': + '@percy/core@1.31.3(typescript@5.9.3)': dependencies: - '@percy/client': 1.30.1 - '@percy/config': 1.30.1(typescript@5.6.3) - '@percy/dom': 1.30.1 - '@percy/logger': 1.30.1 - '@percy/webdriver-utils': 1.30.1(typescript@5.6.3) + '@percy/client': 1.31.3(typescript@5.9.3) + '@percy/config': 1.31.3(typescript@5.9.3) + '@percy/dom': 1.31.3 + '@percy/logger': 1.31.3 + '@percy/monitoring': 1.31.3(typescript@5.9.3) + '@percy/webdriver-utils': 1.31.3(typescript@5.9.3) content-disposition: 0.5.4 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 extract-zip: 2.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 micromatch: 4.0.8 mime-types: 2.1.35 pako: 2.1.0 path-to-regexp: 6.3.0 rimraf: 3.0.2 - ws: 8.18.0 - yaml: 2.5.0 + ws: 8.18.3 + yaml: 2.8.1 transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@percy/dom@1.30.1': {} + '@percy/dom@1.31.3': {} - '@percy/env@1.30.1': + '@percy/env@1.31.3': dependencies: - '@percy/logger': 1.30.1 + '@percy/logger': 1.31.3 - '@percy/logger@1.30.1': {} + '@percy/logger@1.31.3': {} + + '@percy/monitoring@1.31.3(typescript@5.9.3)': + dependencies: + '@percy/config': 1.31.3(typescript@5.9.3) + '@percy/logger': 1.31.3 + '@percy/sdk-utils': 1.31.3 + systeminformation: 5.27.11 + transitivePeerDependencies: + - supports-color + - typescript - '@percy/playwright@1.0.6(playwright-core@1.46.1)': + '@percy/playwright@1.0.9(playwright-core@1.56.0)': dependencies: - playwright-core: 1.46.1 + playwright-core: 1.56.0 - '@percy/sdk-utils@1.30.1': {} + '@percy/sdk-utils@1.31.3': + dependencies: + pac-proxy-agent: 7.2.0 + transitivePeerDependencies: + - supports-color - '@percy/webdriver-utils@1.30.1(typescript@5.6.3)': + '@percy/webdriver-utils@1.31.3(typescript@5.9.3)': dependencies: - '@percy/config': 1.30.1(typescript@5.6.3) - '@percy/sdk-utils': 1.30.1 + '@percy/config': 1.31.3(typescript@5.9.3) + '@percy/sdk-utils': 1.31.3 transitivePeerDependencies: + - supports-color - typescript - '@pinia/nuxt@0.5.5(magicast@0.3.5)(rollup@4.24.4)(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)': + '@pinia/nuxt@0.11.2(magicast@0.3.5)(pinia@3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)))': dependencies: - '@nuxt/kit': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - pinia: 2.2.6(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + '@nuxt/kit': 3.19.3(magicast@0.3.5) + pinia: 3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - - '@vue/composition-api' - magicast - - rollup - - supports-color - - typescript - - vue - - webpack-sources '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.1.1': {} + '@pkgr/core@0.2.9': {} - '@playwright/test@1.46.1': + '@playwright/test@1.56.0': dependencies: - playwright: 1.46.1 + playwright: 1.56.0 - '@polka/url@1.0.0-next.25': {} + '@polka/url@1.0.0-next.29': {} '@popperjs/core@2.11.8': {} + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.1.0 + supports-color: 10.2.2 + + '@poppinss/exception@1.2.2': {} + + '@prisma/instrumentation@6.15.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -12062,53 +13135,52 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@pulumi/aws@5.43.0(typescript@5.6.3)': + '@pulumi/aws@6.83.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) - aws-sdk: 2.1682.0 - builtin-modules: 3.0.0 + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) mime: 2.6.0 - read-package-tree: 5.3.1 - resolve: 1.22.8 transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@pulumi/aws@6.58.0(typescript@5.6.3)': + '@pulumi/aws@7.8.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) - builtin-modules: 3.0.0 + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) mime: 2.6.0 - resolve: 1.22.8 transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@pulumi/awsx@1.0.6(typescript@5.6.3)': + '@pulumi/awsx@2.22.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/aws': 5.43.0(typescript@5.6.3) - '@pulumi/docker': 3.6.1(typescript@5.6.3) - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) - '@types/aws-lambda': 8.10.143 + '@aws-sdk/client-ecs': 3.908.0 + '@pulumi/aws': 6.83.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/docker': 4.9.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/docker-build': 0.0.8(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@types/aws-lambda': 8.10.155 + docker-classic: '@pulumi/docker@3.6.1(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)' mime: 2.6.0 transitivePeerDependencies: + - aws-crt - bluebird - supports-color - ts-node - typescript - '@pulumi/awsx@2.17.0(typescript@5.6.3)': + '@pulumi/awsx@3.0.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@aws-sdk/client-ecs': 3.637.0 - '@pulumi/aws': 6.58.0(typescript@5.6.3) - '@pulumi/docker': 4.5.5(typescript@5.6.3) - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) - '@types/aws-lambda': 8.10.143 - docker-classic: '@pulumi/docker@3.6.1(typescript@5.6.3)' + '@aws-sdk/client-ecs': 3.908.0 + '@pulumi/aws': 7.8.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/docker': 4.9.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/docker-build': 0.0.8(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@types/aws-lambda': 8.10.155 + docker-classic: '@pulumi/docker@3.6.1(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)' mime: 2.6.0 transitivePeerDependencies: - aws-crt @@ -12117,9 +13189,18 @@ snapshots: - ts-node - typescript - '@pulumi/docker@3.6.1(typescript@5.6.3)': + '@pulumi/docker-build@0.0.8(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': + dependencies: + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + transitivePeerDependencies: + - bluebird + - supports-color + - ts-node + - typescript + + '@pulumi/docker@3.6.1(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) semver: 5.7.2 transitivePeerDependencies: - bluebird @@ -12127,9 +13208,9 @@ snapshots: - ts-node - typescript - '@pulumi/docker@4.5.5(typescript@5.6.3)': + '@pulumi/docker@4.9.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) semver: 5.7.2 transitivePeerDependencies: - bluebird @@ -12137,25 +13218,23 @@ snapshots: - ts-node - typescript - '@pulumi/pulumi@3.138.0(typescript@5.6.3)': + '@pulumi/pulumi@3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@grpc/grpc-js': 1.11.1 + '@grpc/grpc-js': 1.14.0 '@logdna/tail-file': 2.2.0 '@npmcli/arborist': 7.5.4 '@opentelemetry/api': 1.9.0 - '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-grpc': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.26.0 - '@pulumi/query': 0.3.0 + '@opentelemetry/exporter-zipkin': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) '@types/google-protobuf': 3.15.12 - '@types/semver': 7.5.8 + '@types/semver': 7.7.1 '@types/tmp': 0.2.6 execa: 5.1.1 - fdir: 6.4.0(picomatch@3.0.1) + fdir: 6.5.0(picomatch@3.0.1) google-protobuf: 3.21.4 got: 11.8.6 ini: 2.0.0 @@ -12165,288 +13244,341 @@ snapshots: picomatch: 3.0.1 pkg-dir: 7.0.0 require-from-string: 2.0.2 - semver: 7.6.3 + semver: 7.7.3 source-map-support: 0.5.21 - tmp: 0.2.1 + tmp: 0.2.5 upath: 1.2.0 optionalDependencies: - typescript: 5.6.3 + ts-node: 10.9.2(@types/node@24.7.2)(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - bluebird - supports-color - '@pulumi/query@0.3.0': {} - - '@pulumi/random@4.16.3(typescript@5.6.3)': + '@pulumi/random@4.18.3(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@redocly/ajv@8.11.2': - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js-replace: 1.0.1 - - '@redocly/config@0.16.0': {} + '@remirror/core-constants@3.0.0': {} - '@redocly/openapi-core@1.25.11(encoding@0.1.13)(supports-color@9.4.0)': - dependencies: - '@redocly/ajv': 8.11.2 - '@redocly/config': 0.16.0 - colorette: 1.4.0 - https-proxy-agent: 7.0.5(supports-color@9.4.0) - js-levenshtein: 1.1.6 - js-yaml: 4.1.0 - lodash.isequal: 4.5.0 - minimatch: 5.1.6 - node-fetch: 2.7.0(encoding@0.1.13) - pluralize: 8.0.0 - yaml-ast-parser: 0.0.43 - transitivePeerDependencies: - - encoding - - supports-color + '@rolldown/pluginutils@1.0.0-beta.29': {} - '@remirror/core-constants@3.0.0': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} - '@rollup/plugin-alias@5.1.1(rollup@4.24.4)': + '@rollup/plugin-alias@5.1.1(rollup@4.52.4)': optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/plugin-commonjs@28.0.1(rollup@4.24.4)': + '@rollup/plugin-commonjs@28.0.6(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 - magic-string: 0.30.12 - picomatch: 4.0.2 + magic-string: 0.30.19 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/plugin-inject@5.0.5(rollup@4.24.4)': + '@rollup/plugin-inject@5.0.5(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) estree-walker: 2.0.2 - magic-string: 0.30.12 + magic-string: 0.30.19 optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/plugin-json@6.1.0(rollup@4.24.4)': + '@rollup/plugin-json@6.1.0(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.4)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.8 - optionalDependencies: - rollup: 4.24.4 - - '@rollup/plugin-replace@5.0.7(rollup@4.24.4)': - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) - magic-string: 0.30.12 + resolve: 1.22.10 optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/plugin-replace@6.0.1(rollup@4.24.4)': + '@rollup/plugin-replace@6.0.2(rollup@4.52.4)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) - magic-string: 0.30.12 + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) + magic-string: 0.30.19 optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/plugin-terser@0.4.4(rollup@4.24.4)': + '@rollup/plugin-terser@0.4.4(rollup@4.52.4)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.36.0 + terser: 5.44.0 optionalDependencies: - rollup: 4.24.4 - - '@rollup/pluginutils@4.2.1': - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 + rollup: 4.52.4 - '@rollup/pluginutils@5.1.0(rollup@4.24.4)': + '@rollup/pluginutils@5.3.0(rollup@4.52.4)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - '@rollup/pluginutils@5.1.2(rollup@4.24.4)': - dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.24.4 + '@rollup/rollup-android-arm-eabi@4.52.4': + optional: true - '@rollup/pluginutils@5.1.3(rollup@4.24.4)': - dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.24.4 + '@rollup/rollup-android-arm64@4.52.4': + optional: true - '@rollup/rollup-android-arm-eabi@4.24.4': + '@rollup/rollup-darwin-arm64@4.52.4': optional: true - '@rollup/rollup-android-arm64@4.24.4': + '@rollup/rollup-darwin-x64@4.52.4': optional: true - '@rollup/rollup-darwin-arm64@4.24.4': + '@rollup/rollup-freebsd-arm64@4.52.4': optional: true - '@rollup/rollup-darwin-x64@4.24.4': + '@rollup/rollup-freebsd-x64@4.52.4': optional: true - '@rollup/rollup-freebsd-arm64@4.24.4': + '@rollup/rollup-linux-arm-gnueabihf@4.52.4': optional: true - '@rollup/rollup-freebsd-x64@4.24.4': + '@rollup/rollup-linux-arm-musleabihf@4.52.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.4': + '@rollup/rollup-linux-arm64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.4': + '@rollup/rollup-linux-arm64-musl@4.52.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.4': + '@rollup/rollup-linux-loong64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.4': + '@rollup/rollup-linux-ppc64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.4': + '@rollup/rollup-linux-riscv64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.4': + '@rollup/rollup-linux-riscv64-musl@4.52.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.4': + '@rollup/rollup-linux-s390x-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.4': + '@rollup/rollup-linux-x64-gnu@4.52.4': optional: true - '@rollup/rollup-linux-x64-musl@4.24.4': + '@rollup/rollup-linux-x64-musl@4.52.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.4': + '@rollup/rollup-openharmony-arm64@4.52.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.4': + '@rollup/rollup-win32-arm64-msvc@4.52.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.4': + '@rollup/rollup-win32-ia32-msvc@4.52.4': optional: true - '@rushstack/node-core-library@5.7.0(@types/node@22.9.0)': + '@rollup/rollup-win32-x64-gnu@4.52.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.4': + optional: true + + '@rushstack/node-core-library@5.13.0(@types/node@24.7.2)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 + fs-extra: 11.3.2 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 - '@rushstack/terminal@0.14.0(@types/node@22.9.0)': + '@rushstack/terminal@0.15.2(@types/node@24.7.2)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.9.0) + '@rushstack/node-core-library': 5.13.0(@types/node@24.7.2) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 - '@rushstack/ts-command-line@4.22.6(@types/node@22.9.0)': + '@rushstack/ts-command-line@4.23.7(@types/node@24.7.2)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.9.0) + '@rushstack/terminal': 0.15.2(@types/node@24.7.2) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' + '@scarf/scarf@1.4.0': {} + '@sec-ant/readable-stream@0.4.1': {} - '@selderee/plugin-htmlparser2@0.11.0': + '@sentry-internal/node-cpu-profiler@2.2.0': dependencies: - domhandler: 5.0.3 - selderee: 0.11.0 + detect-libc: 2.1.2 + node-abi: 3.78.0 - '@shikijs/core@1.22.2': + '@sentry/core@10.19.0': {} + + '@sentry/nestjs@10.19.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)': dependencies: - '@shikijs/engine-javascript': 1.22.2 - '@shikijs/engine-oniguruma': 1.22.2 - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.3 + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@sentry/core': 10.19.0 + '@sentry/node': 10.19.0 + transitivePeerDependencies: + - supports-color + + '@sentry/node-core@10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': + dependencies: + '@apm-js-collab/tracing-hooks': 0.3.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@sentry/core': 10.19.0 + '@sentry/opentelemetry': 10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + import-in-the-middle: 1.15.0 + transitivePeerDependencies: + - supports-color - '@shikijs/engine-javascript@1.22.2': + '@sentry/node@10.19.0': dependencies: - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 - oniguruma-to-js: 0.4.3 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.22.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.24.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.48.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.204.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.14.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.49.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.50.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.51.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.23.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.15.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@prisma/instrumentation': 6.15.0(@opentelemetry/api@1.9.0) + '@sentry/core': 10.19.0 + '@sentry/node-core': 10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + '@sentry/opentelemetry': 10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) + import-in-the-middle: 1.15.0 + minimatch: 9.0.5 + transitivePeerDependencies: + - supports-color - '@shikijs/engine-oniguruma@1.22.2': + '@sentry/opentelemetry@10.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@sentry/core': 10.19.0 - '@shikijs/transformers@1.22.2': + '@sentry/profiling-node@10.19.0': dependencies: - shiki: 1.22.2 + '@sentry-internal/node-cpu-profiler': 2.2.0 + '@sentry/core': 10.19.0 + '@sentry/node': 10.19.0 + transitivePeerDependencies: + - supports-color - '@shikijs/types@1.22.2': + '@shikijs/core@2.5.0': dependencies: - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate@9.3.0': {} + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 - '@sideway/address@4.1.5': + '@shikijs/transformers@2.5.0': dependencies: - '@hapi/hoek': 9.3.0 + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 - '@sideway/formula@3.0.1': {} + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 - '@sideway/pinpoint@2.0.0': {} + '@shikijs/vscode-textmate@10.0.2': {} '@sigstore/bundle@2.3.2': dependencies: - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 '@sigstore/core@1.1.0': {} - '@sigstore/protobuf-specs@0.3.2': {} + '@sigstore/protobuf-specs@0.3.3': {} '@sigstore/sign@2.3.2': dependencies: '@sigstore/bundle': 2.3.2 '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 make-fetch-happen: 13.0.1 proc-log: 4.2.0 promise-retry: 2.0.1 @@ -12455,7 +13587,7 @@ snapshots: '@sigstore/tuf@2.3.4': dependencies: - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 tuf-js: 2.2.1 transitivePeerDependencies: - supports-color @@ -12464,550 +13596,533 @@ snapshots: dependencies: '@sigstore/bundle': 2.3.2 '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 + + '@sinclair/typebox@0.34.41': {} '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/is@7.1.0': {} '@sindresorhus/merge-streams@4.0.0': {} - '@smithy/abort-controller@3.1.6': - dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@smithy/chunked-blob-reader-native@3.0.1': - dependencies: - '@smithy/util-base64': 3.0.0 - tslib: 2.7.0 - - '@smithy/chunked-blob-reader@4.0.0': - dependencies: - tslib: 2.7.0 - - '@smithy/config-resolver@3.0.10': - dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.8 - tslib: 2.7.0 - - '@smithy/core@2.5.1': - dependencies: - '@smithy/middleware-serde': 3.0.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-stream': 3.2.1 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 - - '@smithy/credential-provider-imds@3.2.5': - dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - tslib: 2.7.0 - - '@smithy/eventstream-codec@3.1.7': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 3.6.0 - '@smithy/util-hex-encoding': 3.0.0 - tslib: 2.7.0 - - '@smithy/eventstream-serde-browser@3.0.11': - dependencies: - '@smithy/eventstream-serde-universal': 3.0.10 - '@smithy/types': 3.6.0 - tslib: 2.7.0 - - '@smithy/eventstream-serde-config-resolver@3.0.8': + '@sinonjs/commons@3.0.1': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + type-detect: 4.0.8 - '@smithy/eventstream-serde-node@3.0.10': + '@sinonjs/fake-timers@13.0.5': dependencies: - '@smithy/eventstream-serde-universal': 3.0.10 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@sinonjs/commons': 3.0.1 - '@smithy/eventstream-serde-universal@3.0.10': + '@smithy/abort-controller@4.2.0': dependencies: - '@smithy/eventstream-codec': 3.1.7 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/fetch-http-handler@3.2.9': + '@smithy/config-resolver@4.3.0': dependencies: - '@smithy/protocol-http': 4.1.5 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 - '@smithy/util-base64': 3.0.0 - tslib: 2.7.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 - '@smithy/fetch-http-handler@4.0.0': + '@smithy/core@3.15.0': dependencies: - '@smithy/protocol-http': 4.1.5 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 - '@smithy/util-base64': 3.0.0 - tslib: 2.7.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-stream': 4.5.0 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 - '@smithy/hash-blob-browser@3.1.7': + '@smithy/credential-provider-imds@4.2.0': dependencies: - '@smithy/chunked-blob-reader': 4.0.0 - '@smithy/chunked-blob-reader-native': 3.0.1 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + tslib: 2.8.1 - '@smithy/hash-node@3.0.8': + '@smithy/fetch-http-handler@5.3.1': dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 - '@smithy/hash-stream-node@3.1.7': + '@smithy/hash-node@4.2.0': dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@smithy/invalid-dependency@3.0.8': + '@smithy/invalid-dependency@4.2.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: - tslib: 2.7.0 - - '@smithy/is-array-buffer@3.0.0': - dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/md5-js@3.0.8': + '@smithy/is-array-buffer@4.2.0': dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/middleware-content-length@3.0.10': + '@smithy/middleware-content-length@4.2.0': dependencies: - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/middleware-endpoint@3.2.1': + '@smithy/middleware-endpoint@4.3.1': dependencies: - '@smithy/core': 2.5.1 - '@smithy/middleware-serde': 3.0.8 - '@smithy/node-config-provider': 3.1.9 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - '@smithy/url-parser': 3.0.8 - '@smithy/util-middleware': 3.0.8 - tslib: 2.7.0 + '@smithy/core': 3.15.0 + '@smithy/middleware-serde': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/url-parser': 4.2.0 + '@smithy/util-middleware': 4.2.0 + tslib: 2.8.1 - '@smithy/middleware-retry@3.0.25': + '@smithy/middleware-retry@4.4.1': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/protocol-http': 4.1.5 - '@smithy/service-error-classification': 3.0.8 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-retry': 3.0.8 - tslib: 2.7.0 - uuid: 9.0.1 + '@smithy/node-config-provider': 4.3.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-retry': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 - '@smithy/middleware-serde@3.0.8': + '@smithy/middleware-serde@4.2.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/middleware-stack@3.0.8': + '@smithy/middleware-stack@4.2.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/node-config-provider@3.1.9': + '@smithy/node-config-provider@4.3.0': dependencies: - '@smithy/property-provider': 3.1.8 - '@smithy/shared-ini-file-loader': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/property-provider': 4.2.0 + '@smithy/shared-ini-file-loader': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/node-http-handler@3.2.5': + '@smithy/node-http-handler@4.3.0': dependencies: - '@smithy/abort-controller': 3.1.6 - '@smithy/protocol-http': 4.1.5 - '@smithy/querystring-builder': 3.0.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/abort-controller': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/querystring-builder': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/property-provider@3.1.8': + '@smithy/property-provider@4.2.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/protocol-http@4.1.5': + '@smithy/protocol-http@5.3.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/querystring-builder@3.0.8': + '@smithy/querystring-builder@4.2.0': dependencies: - '@smithy/types': 3.6.0 - '@smithy/util-uri-escape': 3.0.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 - '@smithy/querystring-parser@3.0.8': + '@smithy/querystring-parser@4.2.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/service-error-classification@3.0.8': + '@smithy/service-error-classification@4.2.0': dependencies: - '@smithy/types': 3.6.0 + '@smithy/types': 4.6.0 - '@smithy/shared-ini-file-loader@3.1.9': + '@smithy/shared-ini-file-loader@4.3.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/signature-v4@4.2.0': + '@smithy/signature-v4@5.3.0': dependencies: - '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.8 - '@smithy/util-uri-escape': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.0 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@smithy/smithy-client@3.4.2': + '@smithy/smithy-client@4.7.1': dependencies: - '@smithy/core': 2.5.1 - '@smithy/middleware-endpoint': 3.2.1 - '@smithy/middleware-stack': 3.0.8 - '@smithy/protocol-http': 4.1.5 - '@smithy/types': 3.6.0 - '@smithy/util-stream': 3.2.1 - tslib: 2.7.0 + '@smithy/core': 3.15.0 + '@smithy/middleware-endpoint': 4.3.1 + '@smithy/middleware-stack': 4.2.0 + '@smithy/protocol-http': 5.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-stream': 4.5.0 + tslib: 2.8.1 - '@smithy/types@3.6.0': + '@smithy/types@4.6.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/url-parser@3.0.8': + '@smithy/url-parser@4.2.0': dependencies: - '@smithy/querystring-parser': 3.0.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/querystring-parser': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-base64@3.0.0': + '@smithy/util-base64@4.3.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@smithy/util-body-length-browser@3.0.0': + '@smithy/util-body-length-browser@4.2.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/util-body-length-node@3.0.0': + '@smithy/util-body-length-node@4.2.1': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@smithy/util-buffer-from@2.2.0': dependencies: '@smithy/is-array-buffer': 2.2.0 - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/util-buffer-from@3.0.0': + '@smithy/util-buffer-from@4.2.0': dependencies: - '@smithy/is-array-buffer': 3.0.0 - tslib: 2.7.0 + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 - '@smithy/util-config-provider@3.0.0': + '@smithy/util-config-provider@4.2.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@3.0.25': + '@smithy/util-defaults-mode-browser@4.3.0': dependencies: - '@smithy/property-provider': 3.1.8 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - bowser: 2.11.0 - tslib: 2.7.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.25': + '@smithy/util-defaults-mode-node@4.2.1': dependencies: - '@smithy/config-resolver': 3.0.10 - '@smithy/credential-provider-imds': 3.2.5 - '@smithy/node-config-provider': 3.1.9 - '@smithy/property-provider': 3.1.8 - '@smithy/smithy-client': 3.4.2 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/config-resolver': 4.3.0 + '@smithy/credential-provider-imds': 4.2.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/property-provider': 4.2.0 + '@smithy/smithy-client': 4.7.1 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-endpoints@2.1.4': + '@smithy/util-endpoints@3.2.0': dependencies: - '@smithy/node-config-provider': 3.1.9 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/node-config-provider': 4.3.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-hex-encoding@3.0.0': + '@smithy/util-hex-encoding@4.2.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@smithy/util-middleware@3.0.8': + '@smithy/util-middleware@4.2.0': dependencies: - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-retry@3.0.8': + '@smithy/util-retry@4.2.0': dependencies: - '@smithy/service-error-classification': 3.0.8 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + '@smithy/service-error-classification': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-stream@3.2.1': + '@smithy/util-stream@4.5.0': dependencies: - '@smithy/fetch-http-handler': 4.0.0 - '@smithy/node-http-handler': 3.2.5 - '@smithy/types': 3.6.0 - '@smithy/util-base64': 3.0.0 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-utf8': 3.0.0 - tslib: 2.7.0 + '@smithy/fetch-http-handler': 5.3.1 + '@smithy/node-http-handler': 4.3.0 + '@smithy/types': 4.6.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@smithy/util-uri-escape@3.0.0': + '@smithy/util-uri-escape@4.2.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 - tslib: 2.7.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 - '@smithy/util-utf8@3.0.0': + '@smithy/util-waiter@4.2.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 - tslib: 2.7.0 + '@smithy/abort-controller': 4.2.0 + '@smithy/types': 4.6.0 + tslib: 2.8.1 - '@smithy/util-waiter@3.1.7': + '@smithy/uuid@1.1.0': dependencies: - '@smithy/abort-controller': 3.1.6 - '@smithy/types': 3.6.0 - tslib: 2.7.0 + tslib: 2.8.1 + + '@speed-highlight/core@1.2.7': {} - '@studion/infra-code-blocks@0.6.11(typescript@5.6.3)': + '@standard-schema/spec@1.0.0': {} + + '@studion/infra-code-blocks@0.7.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/aws': 5.43.0(typescript@5.6.3) - '@pulumi/awsx': 1.0.6(typescript@5.6.3) - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) - '@pulumi/random': 4.16.3(typescript@5.6.3) - '@upstash/pulumi': 0.2.0(typescript@5.6.3) + '@pulumi/aws': 6.83.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/awsx': 2.22.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@pulumi/random': 4.18.3(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) + '@upstash/pulumi': 0.3.14(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) transitivePeerDependencies: + - aws-crt - bluebird - supports-color - ts-node - typescript - '@stylistic/eslint-plugin@2.10.1(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@stylistic/eslint-plugin@5.4.0(eslint@9.37.0(jiti@2.6.1))': dependencies: - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - eslint: 9.14.0(jiti@2.4.0) - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + '@typescript-eslint/types': 8.46.0 + eslint: 9.37.0(jiti@2.6.1) + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.2 - transitivePeerDependencies: - - supports-color - - typescript + picomatch: 4.0.3 '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - '@tiptap/core@2.9.1(@tiptap/pm@2.9.1)': + '@tiptap/core@2.26.3(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/pm': 2.9.1 + '@tiptap/pm': 2.26.3 - '@tiptap/extension-blockquote@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-blockquote@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-bold@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-bold@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-bubble-menu@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-bubble-menu@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-bullet-list@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-character-count@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-character-count@3.6.6(@tiptap/extensions@3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/extensions': 3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) - '@tiptap/extension-code-block@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-code-block@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-code@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-code@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-document@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-document@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-dropcursor@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-dropcursor@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-floating-menu@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-floating-menu@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-gapcursor@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-hard-break@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-hard-break@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-heading@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-heading@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-history@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-history@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-horizontal-rule@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)': + '@tiptap/extension-horizontal-rule@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-italic@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-italic@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-list-item@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-list-item@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-ordered-list@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-ordered-list@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-paragraph@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-paragraph@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-strike@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-strike@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-subscript@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-subscript@3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-superscript@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-superscript@3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 - '@tiptap/extension-text-style@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-text-style@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-text@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-text@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/extension-underline@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))': + '@tiptap/extension-underline@3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))': dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) - '@tiptap/pm@2.9.1': + '@tiptap/extensions@3.6.6(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)': dependencies: - prosemirror-changeset: 2.2.1 + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 + + '@tiptap/pm@2.26.3': + dependencies: + prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 - prosemirror-commands: 1.6.2 - prosemirror-dropcursor: 1.8.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 prosemirror-gapcursor: 1.3.2 prosemirror-history: 1.4.1 - prosemirror-inputrules: 1.4.0 - prosemirror-keymap: 1.2.2 - prosemirror-markdown: 1.13.1 - prosemirror-menu: 1.2.4 - prosemirror-model: 1.23.0 - prosemirror-schema-basic: 1.2.3 - prosemirror-schema-list: 1.4.1 + prosemirror-inputrules: 1.5.0 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.3 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.3 - prosemirror-tables: 1.6.1 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-view@1.36.0) - prosemirror-transform: 1.10.2 - prosemirror-view: 1.36.0 - - '@tiptap/starter-kit@2.9.1': - dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/extension-blockquote': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-bold': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-bullet-list': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-code': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-code-block': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-document': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-dropcursor': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-gapcursor': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-hard-break': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-heading': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-history': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-horizontal-rule': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-italic': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-list-item': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-ordered-list': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-paragraph': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-strike': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-text': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/extension-text-style': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1)) - '@tiptap/pm': 2.9.1 - - '@tiptap/vue-3@2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1)(vue@3.5.12(typescript@5.6.3))': - dependencies: - '@tiptap/core': 2.9.1(@tiptap/pm@2.9.1) - '@tiptap/extension-bubble-menu': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/extension-floating-menu': 2.9.1(@tiptap/core@2.9.1(@tiptap/pm@2.9.1))(@tiptap/pm@2.9.1) - '@tiptap/pm': 2.9.1 - vue: 3.5.12(typescript@5.6.3) - - '@trysound/sax@0.2.0': {} + prosemirror-tables: 1.8.1 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3) + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 + + '@tiptap/starter-kit@2.26.3': + dependencies: + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/extension-blockquote': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-bold': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-bullet-list': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-code': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-code-block': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/extension-document': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-dropcursor': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/extension-gapcursor': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/extension-hard-break': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-heading': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-history': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/extension-horizontal-rule': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/extension-italic': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-list-item': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-ordered-list': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-paragraph': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-strike': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-text': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/extension-text-style': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)) + '@tiptap/pm': 2.26.3 + + '@tiptap/vue-3@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@tiptap/core': 2.26.3(@tiptap/pm@2.26.3) + '@tiptap/extension-bubble-menu': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/extension-floating-menu': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3) + '@tiptap/pm': 2.26.3 + vue: 3.5.22(typescript@5.9.3) + + '@tokenizer/inflate@0.2.7': + dependencies: + debug: 4.4.3 + fflate: 0.8.2 + token-types: 6.1.1 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@ts-morph/common@0.28.1': + dependencies: + minimatch: 10.0.3 + path-browserify: 1.0.1 + tinyglobby: 0.2.15 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} '@tufjs/canonical-json@2.0.0': {} @@ -13016,71 +14131,136 @@ snapshots: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} - '@types/aws-lambda@8.10.143': {} + '@types/aws-lambda@8.10.155': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.4 + + '@types/bcrypt@6.0.0': + dependencies: + '@types/node': 24.7.2 '@types/bluebird@3.5.42': {} - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.9.0 + '@types/node': 24.7.2 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.9.0 + '@types/node': 24.7.2 '@types/responselike': 1.0.3 '@types/connect@3.4.38': dependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 + + '@types/cookie-parser@1.4.9(@types/express@5.0.3)': + dependencies: + '@types/express': 5.0.3 + + '@types/cookiejar@2.1.5': {} '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 + + '@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.6': {} + '@types/estree@1.0.8': {} - '@types/express-serve-static-core@5.0.1': + '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 22.9.0 - '@types/qs': 6.9.17 + '@types/node': 24.7.2 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 1.2.0 - '@types/express@5.0.0': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 5.0.1 - '@types/qs': 6.9.17 - '@types/serve-static': 1.15.7 + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 1.15.9 '@types/google-protobuf@3.15.12': {} + '@types/handlebars@4.1.0': + dependencies: + handlebars: 4.7.8 + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 '@types/http-cache-semantics@4.0.4': {} - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} - '@types/http-proxy@1.17.15': + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@30.0.0': dependencies: - '@types/node': 22.9.0 + expect: 30.2.0 + pretty-format: 30.2.0 '@types/json-schema@7.0.15': {} + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 24.7.2 + '@types/keyv@3.1.4': dependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 '@types/linkify-it@5.0.0': {} - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.20': {} '@types/markdown-it@14.1.2': dependencies: @@ -13093,40 +14273,70 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/methods@1.1.4': {} + '@types/mime@1.3.5': {} - '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': {} + + '@types/multer@2.0.0': + dependencies: + '@types/express': 5.0.3 + + '@types/mysql@2.15.27': + dependencies: + '@types/node': 24.7.2 + + '@types/node@24.7.2': + dependencies: + undici-types: 7.14.0 + + '@types/nodemailer@7.0.2': + dependencies: + '@aws-sdk/client-sesv2': 3.908.0 + '@types/node': 24.7.2 + transitivePeerDependencies: + - aws-crt - '@types/ms@0.7.34': {} + '@types/parse-path@7.1.0': + dependencies: + parse-path: 7.1.0 - '@types/mute-stream@0.0.4': + '@types/passport-jwt@4.0.1': dependencies: - '@types/node': 22.9.0 + '@types/jsonwebtoken': 9.0.10 + '@types/passport-strategy': 0.2.38 - '@types/node-fetch@2.6.11': + '@types/passport-local@1.0.38': dependencies: - '@types/node': 22.9.0 - form-data: 4.0.0 + '@types/express': 5.0.3 + '@types/passport': 1.0.17 + '@types/passport-strategy': 0.2.38 - '@types/node@18.19.45': + '@types/passport-strategy@0.2.38': dependencies: - undici-types: 5.26.5 + '@types/express': 5.0.3 + '@types/passport': 1.0.17 - '@types/node@22.5.0': + '@types/passport@1.0.17': dependencies: - undici-types: 6.19.8 + '@types/express': 5.0.3 - '@types/node@22.9.0': + '@types/pg-pool@2.0.6': dependencies: - undici-types: 6.19.8 + '@types/pg': 8.15.5 - '@types/normalize-package-data@2.4.4': {} + '@types/pg@8.15.5': + dependencies: + '@types/node': 24.7.2 + pg-protocol: 1.10.3 + pg-types: 2.2.0 '@types/pluralize@0.0.33': {} '@types/promise-queue@2.2.3': {} - '@types/qs@6.9.17': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} @@ -13134,638 +14344,630 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 - '@types/semver@7.5.8': {} + '@types/semver@7.7.1': {} - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.9.0 + '@types/node': 24.7.2 + + '@types/send@1.2.0': + dependencies: + '@types/node': 24.7.2 + + '@types/serve-static@1.15.9': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.7.2 + '@types/send': 0.17.5 - '@types/serve-static@1.15.7': + '@types/set-cookie-parser@2.4.10': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.9.0 - '@types/send': 0.17.4 + '@types/node': 24.7.2 '@types/shimmer@1.2.0': {} + '@types/stack-utils@2.0.3': {} + + '@types/superagent@8.1.9': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 24.7.2 + form-data: 4.0.4 + + '@types/supertest@6.0.3': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.9 + + '@types/tedious@4.0.14': + dependencies: + '@types/node': 24.7.2 + '@types/tmp@0.2.6': {} '@types/unist@3.0.3': {} - '@types/validator@13.12.1': {} + '@types/uuid@11.0.0': + dependencies: + uuid: 13.0.0 + + '@types/validator@13.15.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 24.7.2 - '@types/web-bluetooth@0.0.20': {} + '@types/yargs-parser@21.0.3': {} - '@types/wrap-ansi@3.0.0': {} + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 optional: true - '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.13.0 - eslint: 9.14.0(jiti@2.4.0) + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 + eslint: 9.37.0(jiti@2.6.1) graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@9.4.0) - eslint: 9.14.0(jiti@2.4.0) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.0 + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@9.4.0) - eslint: 9.14.0(jiti@2.4.0) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@8.13.0': + '@typescript-eslint/scope-manager@8.46.0': dependencies: - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/visitor-keys': 8.13.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 - '@typescript-eslint/scope-manager@8.2.0': + '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/visitor-keys': 8.2.0 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - debug: 4.3.7(supports-color@9.4.0) - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - - eslint - supports-color - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@8.13.0': {} - - '@typescript-eslint/types@8.2.0': {} + '@typescript-eslint/types@8.46.0': {} - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@9.4.0) - globby: 11.1.0 + '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/visitor-keys': 8.46.0 + debug: 4.4.3 + fast-glob: 3.3.3 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': + '@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@9.4.0) - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.0 + '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + eslint: 9.37.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.2.0(typescript@5.6.3)': + '@typescript-eslint/visitor-keys@8.46.0': dependencies: - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/visitor-keys': 8.2.0 - debug: 4.3.7(supports-color@9.4.0) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.46.0 + eslint-visitor-keys: 4.2.1 - '@typescript-eslint/utils@8.13.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': + '@ungap/structured-clone@1.3.0': {} + + '@unhead/vue@2.0.19(vue@3.5.22(typescript@5.9.3))': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@2.4.0)) - '@typescript-eslint/scope-manager': 8.13.0 - '@typescript-eslint/types': 8.13.0 - '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) - eslint: 9.14.0(jiti@2.4.0) - transitivePeerDependencies: - - supports-color - - typescript + hookable: 5.5.3 + unhead: 2.0.19 + vue: 3.5.22(typescript@5.9.3) + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true - '@typescript-eslint/utils@8.2.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@2.4.0)) - '@typescript-eslint/scope-manager': 8.2.0 - '@typescript-eslint/types': 8.2.0 - '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.6.3) - eslint: 9.14.0(jiti@2.4.0) - transitivePeerDependencies: - - supports-color - - typescript + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true - '@typescript-eslint/visitor-keys@8.13.0': - dependencies: - '@typescript-eslint/types': 8.13.0 - eslint-visitor-keys: 3.4.3 + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true - '@typescript-eslint/visitor-keys@8.2.0': - dependencies: - '@typescript-eslint/types': 8.2.0 - eslint-visitor-keys: 3.4.3 + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true - '@ungap/structured-clone@1.2.0': {} + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true - '@unhead/dom@1.11.11': - dependencies: - '@unhead/schema': 1.11.11 - '@unhead/shared': 1.11.11 + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true - '@unhead/schema@1.11.11': + '@unrs/resolver-binding-wasm32-wasi@1.11.1': dependencies: - hookable: 5.5.3 - zhead: 2.2.4 + '@napi-rs/wasm-runtime': 0.2.12 + optional: true - '@unhead/shared@1.11.11': - dependencies: - '@unhead/schema': 1.11.11 + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true - '@unhead/ssr@1.11.11': - dependencies: - '@unhead/schema': 1.11.11 - '@unhead/shared': 1.11.11 + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true - '@unhead/vue@1.11.11(vue@3.5.12(typescript@5.6.3))': - dependencies: - '@unhead/schema': 1.11.11 - '@unhead/shared': 1.11.11 - defu: 6.1.4 - hookable: 5.5.3 - unhead: 1.11.11 - vue: 3.5.12(typescript@5.6.3) + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true - '@upstash/pulumi@0.2.0(typescript@5.6.3)': + '@upstash/pulumi@0.3.14(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@pulumi/pulumi': 3.138.0(typescript@5.6.3) + '@pulumi/pulumi': 3.202.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3))(typescript@5.9.3) transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@vee-validate/i18n@4.14.6': {} + '@vee-validate/i18n@4.15.1': {} - '@vee-validate/rules@4.14.6(vue@3.5.12(typescript@5.6.3))': + '@vee-validate/rules@4.15.1(vue@3.5.22(typescript@5.9.3))': dependencies: - vee-validate: 4.14.6(vue@3.5.12(typescript@5.6.3)) + vee-validate: 4.15.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - vue - '@vercel/nft@0.27.6(encoding@0.1.13)': + '@vercel/nft@0.30.2(encoding@0.1.13)(rollup@4.52.4)': dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) - '@rollup/pluginutils': 4.2.1 - acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) + '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) + '@rollup/pluginutils': 5.3.0(rollup@4.52.4) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 - glob: 7.2.3 + glob: 10.4.5 graceful-fs: 4.2.11 - micromatch: 4.0.8 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 resolve-from: 5.0.0 transitivePeerDependencies: - encoding + - rollup - supports-color - '@vitejs/plugin-vue-jsx@4.0.1(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.26.0) - '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.26.0) - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) + '@babel/core': 7.28.4 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.43 + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.1.4(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.20(@types/node@24.7.2)(sass@1.93.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3))': dependencies: - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) + vite: 5.4.20(@types/node@24.7.2)(sass@1.93.2)(terser@5.44.0) + vue: 3.5.22(typescript@5.9.3) - '@volar/language-core@2.4.6': + '@vitejs/plugin-vue@6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@volar/source-map': 2.4.6 - optional: true - - '@volar/source-map@2.4.6': - optional: true + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) - '@volar/typescript@2.4.6': + '@volar/language-core@2.4.23': dependencies: - '@volar/language-core': 2.4.6 - path-browserify: 1.0.1 - vscode-uri: 3.0.8 - optional: true + '@volar/source-map': 2.4.23 + + '@volar/source-map@2.4.23': {} - '@vue-macros/common@1.12.2(rollup@4.24.4)(vue@3.5.12(typescript@5.6.3))': + '@vue-macros/common@3.0.0-beta.16(vue@3.5.22(typescript@5.9.3))': dependencies: - '@babel/types': 7.26.0 - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) - '@vue/compiler-sfc': 3.5.12 - ast-kit: 1.1.0 - local-pkg: 0.5.0 - magic-string-ast: 0.6.2 + '@vue/compiler-sfc': 3.5.22 + ast-kit: 2.1.3 + local-pkg: 1.1.2 + magic-string-ast: 1.0.3 + unplugin-utils: 0.2.5 optionalDependencies: - vue: 3.5.12(typescript@5.6.3) - transitivePeerDependencies: - - rollup + vue: 3.5.22(typescript@5.9.3) - '@vue/babel-helper-vue-transform-on@1.2.2': {} + '@vue/babel-helper-vue-transform-on@1.5.0': {} - '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.25.2)': + '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.4)': dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 - '@vue/babel-helper-vue-transform-on': 1.2.2 - '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.25.2) - camelcase: 6.3.0 - html-tags: 3.3.1 - svg-tags: 1.0.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@vue/babel-helper-vue-transform-on': 1.5.0 + '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.28.4) + '@vue/shared': 3.5.22 optionalDependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.28.4 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.26.0)': + '@vue/babel-plugin-resolve-type@1.5.0(@babel/core@7.28.4)': dependencies: - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.26.0) - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 - '@vue/babel-helper-vue-transform-on': 1.2.2 - '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.26.0) - camelcase: 6.3.0 - html-tags: 3.3.1 - svg-tags: 1.0.0 - optionalDependencies: - '@babel/core': 7.26.0 + '@babel/code-frame': 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/parser': 7.28.4 + '@vue/compiler-sfc': 3.5.22 transitivePeerDependencies: - supports-color - '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.25.2)': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/parser': 7.25.4 - '@vue/compiler-sfc': 3.5.12 - - '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.26.0)': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/parser': 7.25.4 - '@vue/compiler-sfc': 3.5.12 - - '@vue/compiler-core@3.4.38': - dependencies: - '@babel/parser': 7.25.4 - '@vue/shared': 3.4.38 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - - '@vue/compiler-core@3.5.12': + '@vue/compiler-core@3.5.22': dependencies: - '@babel/parser': 7.25.4 - '@vue/shared': 3.5.12 + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.22 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.4.38': - dependencies: - '@vue/compiler-core': 3.4.38 - '@vue/shared': 3.4.38 - - '@vue/compiler-dom@3.5.12': + '@vue/compiler-dom@3.5.22': dependencies: - '@vue/compiler-core': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 - '@vue/compiler-sfc@3.5.12': + '@vue/compiler-sfc@3.5.22': dependencies: - '@babel/parser': 7.25.4 - '@vue/compiler-core': 3.5.12 - '@vue/compiler-dom': 3.5.12 - '@vue/compiler-ssr': 3.5.12 - '@vue/shared': 3.5.12 + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 estree-walker: 2.0.2 - magic-string: 0.30.11 - postcss: 8.4.47 + magic-string: 0.30.19 + postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.12': - dependencies: - '@vue/compiler-dom': 3.5.12 - '@vue/shared': 3.5.12 - - '@vue/compiler-vue2@2.7.16': + '@vue/compiler-ssr@3.5.22': dependencies: - de-indent: 1.0.2 - he: 1.2.0 - optional: true + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 '@vue/devtools-api@6.6.4': {} - '@vue/devtools-api@7.6.3': - dependencies: - '@vue/devtools-kit': 7.6.3 - - '@vue/devtools-core@7.3.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))': + '@vue/devtools-api@7.7.7': dependencies: - '@vue/devtools-kit': 7.3.3 - '@vue/devtools-shared': 7.3.9 - mitt: 3.0.1 - nanoid: 3.3.7 - pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - transitivePeerDependencies: - - vite + '@vue/devtools-kit': 7.7.7 - '@vue/devtools-core@7.4.4(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': + '@vue/devtools-core@7.7.7(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: - '@vue/devtools-kit': 7.6.3 - '@vue/devtools-shared': 7.6.3 + '@vue/devtools-kit': 7.7.7 + '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 - nanoid: 3.3.7 - pathe: 1.1.2 - vite-hot-client: 0.2.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)) - vue: 3.5.12(typescript@5.6.3) + nanoid: 5.1.6 + pathe: 2.0.3 + vite-hot-client: 2.1.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - vite - '@vue/devtools-kit@7.3.3': - dependencies: - '@vue/devtools-shared': 7.3.9 - birpc: 0.2.17 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.1 - - '@vue/devtools-kit@7.4.4': - dependencies: - '@vue/devtools-shared': 7.6.3 - birpc: 0.2.19 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.1 - - '@vue/devtools-kit@7.6.3': + '@vue/devtools-kit@7.7.7': dependencies: - '@vue/devtools-shared': 7.6.3 - birpc: 0.2.19 + '@vue/devtools-shared': 7.7.7 + birpc: 2.6.1 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - superjson: 2.2.1 - - '@vue/devtools-shared@7.3.9': - dependencies: - rfdc: 1.4.1 + superjson: 2.2.2 - '@vue/devtools-shared@7.6.3': + '@vue/devtools-shared@7.7.7': dependencies: rfdc: 1.4.1 - '@vue/language-core@2.1.6(typescript@5.6.3)': + '@vue/language-core@3.1.1(typescript@5.9.3)': dependencies: - '@volar/language-core': 2.4.6 - '@vue/compiler-dom': 3.5.12 - '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.12 - computeds: 0.0.1 - minimatch: 9.0.5 + '@volar/language-core': 2.4.23 + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + alien-signals: 3.0.0 muggle-string: 0.4.1 path-browserify: 1.0.1 + picomatch: 4.0.3 optionalDependencies: - typescript: 5.6.3 - optional: true + typescript: 5.9.3 - '@vue/reactivity@3.5.12': + '@vue/reactivity@3.5.22': dependencies: - '@vue/shared': 3.5.12 + '@vue/shared': 3.5.22 - '@vue/runtime-core@3.5.12': + '@vue/runtime-core@3.5.22': dependencies: - '@vue/reactivity': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 - '@vue/runtime-dom@3.5.12': + '@vue/runtime-dom@3.5.22': dependencies: - '@vue/reactivity': 3.5.12 - '@vue/runtime-core': 3.5.12 - '@vue/shared': 3.5.12 + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 csstype: 3.1.3 - '@vue/server-renderer@3.5.12(vue@3.5.12(typescript@5.6.3))': + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': dependencies: - '@vue/compiler-ssr': 3.5.12 - '@vue/shared': 3.5.12 - vue: 3.5.12(typescript@5.6.3) + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.3) - '@vue/shared@3.4.38': {} + '@vue/shared@3.5.22': {} - '@vue/shared@3.5.12': {} - - '@vueuse/core@10.11.1(vue@3.5.12(typescript@5.6.3))': + '@vueuse/core@12.8.2(typescript@5.9.3)': dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.11.1 - '@vueuse/shared': 10.11.1(vue@3.5.12(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript - '@vueuse/core@11.1.0(vue@3.5.12(typescript@5.6.3))': + '@vueuse/core@13.9.0(vue@3.5.22(typescript@5.9.3))': dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 11.1.0 - '@vueuse/shared': 11.1.0(vue@3.5.12(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.9.0 + '@vueuse/shared': 13.9.0(vue@3.5.22(typescript@5.9.3)) + vue: 3.5.22(typescript@5.9.3) - '@vueuse/integrations@11.1.0(axios@1.7.7)(change-case@5.4.4)(focus-trap@7.6.0)(sortablejs@1.14.0)(vue@3.5.12(typescript@5.6.3))': + '@vueuse/integrations@12.8.2(axios@1.12.2)(change-case@5.4.4)(focus-trap@7.6.5)(fuse.js@7.1.0)(sortablejs@1.14.0)(typescript@5.9.3)': dependencies: - '@vueuse/core': 11.1.0(vue@3.5.12(typescript@5.6.3)) - '@vueuse/shared': 11.1.0(vue@3.5.12(typescript@5.6.3)) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/shared': 12.8.2(typescript@5.9.3) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - axios: 1.7.7(debug@4.3.7) + axios: 1.12.2(debug@4.4.3) change-case: 5.4.4 - focus-trap: 7.6.0 + focus-trap: 7.6.5 + fuse.js: 7.1.0 sortablejs: 1.14.0 transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript - '@vueuse/metadata@10.11.1': {} + '@vueuse/metadata@12.8.2': {} - '@vueuse/metadata@11.1.0': {} + '@vueuse/metadata@13.9.0': {} - '@vueuse/shared@10.11.1(vue@3.5.12(typescript@5.6.3))': + '@vueuse/shared@12.8.2(typescript@5.9.3)': dependencies: - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - - '@vue/composition-api' - - vue + - typescript - '@vueuse/shared@11.1.0(vue@3.5.12(typescript@5.6.3))': + '@vueuse/shared@13.9.0(vue@3.5.22(typescript@5.9.3))': dependencies: - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue + vue: 3.5.22(typescript@5.9.3) - JSONStream@1.3.5: + '@webassemblyjs/ast@1.14.1': dependencies: - jsonparse: 1.3.1 - through: 2.3.8 + '@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': {} - abbrev@1.1.1: {} + '@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': {} abbrev@2.0.0: {} + abbrev@3.0.1: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 accepts@2.0.0: dependencies: - mime-types: 3.0.0 + mime-types: 3.0.1 negotiator: 1.0.0 - acorn-import-attributes@1.9.5(acorn@8.14.0): + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: - acorn: 8.14.0 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-import-phases@1.0.4(acorn@8.15.0): dependencies: - acorn: 8.14.0 - - acorn@8.12.1: {} + acorn: 8.15.0 - acorn@8.14.0: {} - - agent-base@6.0.2: + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - debug: 4.3.7(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color + acorn: 8.15.0 - agent-base@7.1.1(supports-color@9.4.0): + acorn-walk@8.3.4: dependencies: - debug: 4.3.7(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color + acorn: 8.15.0 - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 + acorn@8.15.0: {} + + agent-base@7.1.4: {} aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - aggregate-error@4.0.1: - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - aggregate-error@5.0.0: dependencies: - clean-stack: 5.2.0 + clean-stack: 5.3.0 indent-string: 5.0.0 ajv-draft-04@1.0.0(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -13783,27 +14985,28 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 + fast-uri: 3.1.0 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - algoliasearch@4.24.0: - dependencies: - '@algolia/cache-browser-local-storage': 4.24.0 - '@algolia/cache-common': 4.24.0 - '@algolia/cache-in-memory': 4.24.0 - '@algolia/client-account': 4.24.0 - '@algolia/client-analytics': 4.24.0 - '@algolia/client-common': 4.24.0 - '@algolia/client-personalization': 4.24.0 - '@algolia/client-search': 4.24.0 - '@algolia/logger-common': 4.24.0 - '@algolia/logger-console': 4.24.0 - '@algolia/recommend': 4.24.0 - '@algolia/requester-browser-xhr': 4.24.0 - '@algolia/requester-common': 4.24.0 - '@algolia/requester-node-http': 4.24.0 - '@algolia/transporter': 4.24.0 + algoliasearch@5.40.0: + dependencies: + '@algolia/abtesting': 1.6.0 + '@algolia/client-abtesting': 5.40.0 + '@algolia/client-analytics': 5.40.0 + '@algolia/client-common': 5.40.0 + '@algolia/client-insights': 5.40.0 + '@algolia/client-personalization': 5.40.0 + '@algolia/client-query-suggestions': 5.40.0 + '@algolia/client-search': 5.40.0 + '@algolia/ingestion': 1.40.0 + '@algolia/monitoring': 1.40.0 + '@algolia/recommend': 5.40.0 + '@algolia/requester-browser-xhr': 5.40.0 + '@algolia/requester-fetch': 5.40.0 + '@algolia/requester-node-http': 5.40.0 + + alien-signals@3.0.0: {} ansi-align@3.0.1: dependencies: @@ -13817,17 +15020,19 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 + ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + ansis@4.1.0: {} + + ansis@4.2.0: {} anymatch@3.1.3: dependencies: @@ -13836,8 +15041,6 @@ snapshots: append-field@1.0.0: {} - aproba@2.0.0: {} - archiver-utils@5.0.2: dependencies: glob: 10.4.5 @@ -13846,24 +15049,24 @@ snapshots: lazystream: 1.0.1 lodash: 4.17.21 normalize-path: 3.0.0 - readable-stream: 4.5.2 + readable-stream: 4.7.0 archiver@7.0.1: dependencies: archiver-utils: 5.0.2 async: 3.2.6 buffer-crc32: 1.0.0 - readable-stream: 4.5.2 + readable-stream: 4.7.0 readdir-glob: 1.1.3 tar-stream: 3.1.7 zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a are-docs-informative@0.0.2: {} - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 + arg@4.1.3: {} argparse@1.0.10: dependencies: @@ -13871,49 +15074,25 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-flatten@3.0.0: {} + array-timsort@1.0.3: {} array-union@2.1.0: {} - array.prototype.reduce@1.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-array-method-boxes-properly: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - is-string: 1.0.7 + asap@2.0.6: {} - arraybuffer.prototype.slice@1.0.3: + ast-kit@2.1.3: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} - - asap@2.0.6: {} + '@babel/parser': 7.28.4 + pathe: 2.0.3 - ast-kit@1.1.0: + ast-types@0.13.4: dependencies: - '@babel/parser': 7.26.2 - pathe: 1.1.2 + tslib: 2.8.1 - ast-walker-scope@0.6.2: + ast-walker-scope@0.8.3: dependencies: - '@babel/parser': 7.26.2 - ast-kit: 1.1.0 + '@babel/parser': 7.28.4 + ast-kit: 2.1.3 async-sema@3.1.1: {} @@ -13921,65 +15100,100 @@ snapshots: asynckit@0.4.0: {} - at-least-node@1.0.0: {} - atomic-sleep@1.0.0: {} - auto-bind@5.0.1: {} - - autoprefixer@10.4.20(postcss@8.4.47): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.23.3 - caniuse-lite: 1.0.30001653 + browserslist: 4.26.3 + caniuse-lite: 1.0.30001750 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.1 - postcss: 8.4.47 + picocolors: 1.1.1 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 + axe-core@4.10.3: {} - aws-sdk@2.1682.0: + axios@1.12.2(debug@4.4.3): dependencies: - buffer: 4.9.2 - events: 1.1.1 - ieee754: 1.1.13 - jmespath: 0.16.0 - querystring: 0.2.0 - sax: 1.2.1 - url: 0.10.3 - util: 0.12.5 - uuid: 8.0.0 - xml2js: 0.6.2 + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug - axe-core@4.10.0: {} + b4a@1.7.3: {} - axios@1.7.7(debug@4.3.7): + babel-jest@30.2.0(@babel/core@7.28.4): dependencies: - follow-redirects: 1.15.6(debug@4.3.7) - form-data: 4.0.0 - proxy-from-env: 1.1.0 + '@babel/core': 7.28.4 + '@jest/transform': 30.2.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.1 + babel-preset-jest: 30.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 transitivePeerDependencies: - - debug + - supports-color + + babel-plugin-istanbul@7.0.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@30.2.0: + dependencies: + '@types/babel__core': 7.20.5 - b4a@1.6.6: {} + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) + + babel-preset-jest@30.2.0(@babel/core@7.28.4): + dependencies: + '@babel/core': 7.28.4 + babel-plugin-jest-hoist: 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) balanced-match@1.0.2: {} - bare-events@2.4.2: - optional: true + bare-events@2.8.0: {} base64-js@1.5.1: {} - bcrypt@5.1.1(encoding@0.1.13): + baseline-browser-mapping@2.8.16: {} + + basic-ftp@5.0.5: {} + + bcrypt@6.0.0: dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) - node-addon-api: 5.1.0 - transitivePeerDependencies: - - encoding - - supports-color + node-addon-api: 8.5.0 + node-gyp-build: 4.8.4 + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 bin-links@4.0.4: dependencies: @@ -13988,15 +15202,11 @@ snapshots: read-cmd-shim: 4.0.0 write-file-atomic: 5.0.1 - binary-extensions@2.3.0: {} - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - birpc@0.2.17: {} - - birpc@0.2.19: {} + birpc@2.6.1: {} bl@4.1.0: dependencies: @@ -14008,73 +15218,41 @@ snapshots: blueimp-canvas-to-blob@3.29.0: {} - blueimp-md5@2.19.0: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - body-parser@2.0.1: + body-parser@2.2.0: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 3.1.0 - destroy: 1.2.0 + debug: 4.4.3 http-errors: 2.0.0 - iconv-lite: 0.5.2 + iconv-lite: 0.6.3 on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 3.0.0 - type-is: 1.6.18 - unpipe: 1.0.0 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 transitivePeerDependencies: - supports-color boolbase@1.0.0: {} - bowser@2.11.0: {} - - boxen@7.1.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 + bowser@2.12.1: {} boxen@8.0.1: dependencies: ansi-align: 3.0.1 camelcase: 8.0.0 - chalk: 5.3.0 + chalk: 5.6.2 cli-boxes: 3.0.0 string-width: 7.2.0 - type-fest: 4.25.0 + type-fest: 4.41.0 widest-line: 5.0.0 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -14082,19 +15260,21 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.3: + browserslist@4.26.3: dependencies: - caniuse-lite: 1.0.30001653 - electron-to-chromium: 1.5.13 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) + baseline-browser-mapping: 2.8.16 + caniuse-lite: 1.0.30001750 + electron-to-chromium: 1.5.234 + node-releases: 2.0.23 + update-browserslist-db: 1.1.3(browserslist@4.26.3) - browserslist@4.24.2: + bs-logger@0.2.6: dependencies: - caniuse-lite: 1.0.30001679 - electron-to-chromium: 1.5.55 - node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.2) + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 buffer-crc32@0.2.13: {} @@ -14104,17 +15284,6 @@ snapshots: buffer-from@1.1.2: {} - buffer@4.9.2: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - - buffer@5.6.0: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -14125,84 +15294,31 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builtin-modules@3.0.0: {} - - builtin-modules@3.3.0: {} + builtin-modules@5.0.0: {} bundle-name@4.1.0: dependencies: - run-applescript: 7.0.0 + run-applescript: 7.1.0 busboy@1.6.0: dependencies: - streamsearch: 1.1.0 - - bytes@3.1.2: {} - - c12@1.11.1(magicast@0.3.4): - dependencies: - chokidar: 3.6.0 - confbox: 0.1.7 - defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 1.21.6 - mlly: 1.7.1 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.0 - rc9: 2.1.2 - optionalDependencies: - magicast: 0.3.4 - - c12@1.11.1(magicast@0.3.5): - dependencies: - chokidar: 3.6.0 - confbox: 0.1.7 - defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 1.21.6 - mlly: 1.7.1 - ohash: 1.1.3 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.0 - rc9: 2.1.2 - optionalDependencies: - magicast: 0.3.5 - - c12@1.11.2(magicast@0.3.5): - dependencies: - chokidar: 3.6.0 - confbox: 0.1.8 - defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 1.21.6 - mlly: 1.7.2 - ohash: 1.1.4 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.1 - rc9: 2.1.2 - optionalDependencies: - magicast: 0.3.5 + streamsearch: 1.1.0 + + bytes@3.1.2: {} - c12@2.0.1(magicast@0.3.5): + c12@3.3.0(magicast@0.3.5): dependencies: - chokidar: 4.0.1 - confbox: 0.1.8 + chokidar: 4.0.3 + confbox: 0.2.2 defu: 6.1.4 - dotenv: 16.4.5 - giget: 1.2.3 - jiti: 2.4.0 - mlly: 1.7.2 - ohash: 1.1.4 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.1 + dotenv: 17.2.3 + exsolve: 1.0.7 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 rc9: 2.1.2 optionalDependencies: magicast: 0.3.5 @@ -14230,124 +15346,90 @@ snapshots: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - call-bind@1.0.7: + call-bind-apply-helpers@1.0.2: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - camel-case@3.0.0: + call-bound@1.0.4: dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - camelcase-keys@7.0.2: - dependencies: - camelcase: 6.3.0 - map-obj: 4.3.0 - quick-lru: 5.1.1 - type-fest: 1.4.0 + callsites@3.1.0: {} camelcase@5.3.1: {} camelcase@6.3.0: {} - camelcase@7.0.1: {} - camelcase@8.0.0: {} caniuse-api@3.0.0: dependencies: - browserslist: 4.24.2 - caniuse-lite: 1.0.30001679 + browserslist: 4.26.3 + caniuse-lite: 1.0.30001750 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001653: {} + caniuse-lite@1.0.30001750: {} - caniuse-lite@1.0.30001679: {} + casual@1.6.2: + dependencies: + mersenne-twister: 1.1.0 + moment: 2.30.1 ccount@2.0.1: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + chalk@5.6.2: {} change-case@5.4.4: {} + char-regex@1.0.2: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} - chardet@0.7.0: {} - - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 + chardet@2.1.0: {} - cheerio@1.0.0-rc.12: + chokidar@4.0.3: dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 + readdirp: 4.1.2 - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + chownr@2.0.0: {} - chokidar@4.0.1: - dependencies: - readdirp: 4.0.2 + chownr@3.0.0: {} - chownr@2.0.0: {} + chrome-trace-event@1.0.4: {} - ci-info@4.0.0: {} + ci-info@4.3.1: {} citty@0.1.6: dependencies: - consola: 3.2.3 + consola: 3.4.2 + + cjs-module-lexer@1.4.3: {} - cjs-module-lexer@1.4.0: {} + cjs-module-lexer@2.1.0: {} - clean-css@4.2.4: + class-transformer@0.5.1: {} + + class-validator@0.14.2: dependencies: - source-map: 0.6.1 + '@types/validator': 13.15.3 + libphonenumber-js: 1.12.24 + validator: 13.15.15 clean-regexp@1.0.0: dependencies: @@ -14355,26 +15437,12 @@ snapshots: clean-stack@2.2.0: {} - clean-stack@4.2.0: + clean-stack@5.3.0: dependencies: escape-string-regexp: 5.0.0 - clean-stack@5.2.0: - dependencies: - escape-string-regexp: 5.0.0 - - clear@0.1.0: {} - cli-boxes@3.0.0: {} - cli-color@2.0.4: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.17 - timers-ext: 0.1.8 - cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -14385,6 +15453,14 @@ snapshots: cli-spinners@2.9.2: {} + cli-spinners@3.3.0: {} + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cli-width@4.1.0: {} clipboardy@4.0.0: @@ -14393,17 +15469,12 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@7.0.4: + clipboardy@5.0.0: dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + execa: 9.6.0 + is-wayland: 0.1.0 + is-wsl: 3.1.0 + is64bit: 2.0.0 cliui@8.0.1: dependencies: @@ -14421,23 +15492,21 @@ snapshots: cmd-shim@6.0.3: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + co@4.6.0: {} + + code-block-writer@13.0.3: {} + + collect-v8-coverage@1.0.2: {} color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} - color-support@1.1.3: {} - colord@2.9.3: {} - colorette@1.4.0: {} + colorette@2.0.19: {} colorette@2.0.20: {} @@ -14449,21 +15518,31 @@ snapshots: commander@10.0.1: {} - commander@2.20.3: {} + commander@11.1.0: {} + + commander@14.0.1: {} - commander@6.2.1: {} + commander@2.20.3: {} - commander@7.2.0: {} + commander@4.1.1: {} - commander@8.3.0: {} + comment-json@4.4.1: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 comment-parser@1.4.1: {} common-ancestor-path@1.0.1: {} + common-tags@1.8.2: {} + commondir@1.0.1: {} - compatx@0.1.8: {} + compatx@0.2.0: {} + + component-emitter@1.3.1: {} compress-commons@6.0.2: dependencies: @@ -14471,55 +15550,36 @@ snapshots: crc32-stream: 6.0.0 is-stream: 2.0.1 normalize-path: 3.0.0 - readable-stream: 4.5.2 + readable-stream: 4.7.0 compressorjs@1.2.1: dependencies: blueimp-canvas-to-blob: 3.29.0 is-blob: 2.1.0 - computeds@0.0.1: - optional: true - concat-map@0.0.1: {} - concat-stream@1.6.2: + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.8 + readable-stream: 3.6.2 typedarray: 0.0.6 - concurrently@9.1.0: + concurrently@9.2.1: dependencies: chalk: 4.1.2 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 + rxjs: 7.8.2 + shell-quote: 1.8.3 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 - confbox@0.1.7: {} - confbox@0.1.8: {} - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - - connect-history-api-fallback@2.0.0: {} - - consola@3.2.3: {} + confbox@0.2.2: {} - console-control-strings@1.1.0: {} - - consolidate@1.0.4(@babel/core@7.26.0)(lodash@4.17.21)(mustache@4.2.0): - optionalDependencies: - '@babel/core': 7.26.0 - lodash: 4.17.21 - mustache: 4.2.0 + consola@3.4.2: {} content-disposition@0.5.4: dependencies: @@ -14535,6 +15595,8 @@ snapshots: cookie-es@1.2.2: {} + cookie-es@2.0.0: {} + cookie-parser@1.4.7: dependencies: cookie: 0.7.2 @@ -14542,21 +15604,21 @@ snapshots: cookie-signature@1.0.6: {} - cookie-signature@1.0.7: {} + cookie-signature@1.2.2: {} - cookie-signature@1.2.1: {} + cookie@0.7.2: {} - cookie@0.6.0: {} + cookie@1.0.2: {} - cookie@0.7.2: {} + cookiejar@2.1.4: {} copy-anything@3.0.5: dependencies: is-what: 4.1.16 - core-js-compat@3.38.1: + core-js-compat@3.46.0: dependencies: - browserslist: 4.23.3 + browserslist: 4.26.3 core-util-is@1.0.3: {} @@ -14565,50 +15627,57 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@8.3.6(typescript@5.6.3): + cosmiconfig@8.3.6(typescript@5.8.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.8.3 + + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 crc-32@1.2.2: {} crc32-stream@6.0.0: dependencies: crc-32: 1.2.2 - readable-stream: 4.5.2 + readable-stream: 4.7.0 create-require@1.1.1: {} crelt@1.0.6: {} - croner@9.0.0: {} + croner@9.1.0: {} - cronstrue@2.50.0: {} - - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.1: + crossws@0.3.5: dependencies: uncrypto: 0.1.3 - css-declaration-sorter@7.2.0(postcss@8.4.47): + css-declaration-sorter@7.3.0(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 - css-select@5.1.0: + css-select@5.2.2: dependencies: boolbase: 1.0.0 - css-what: 6.1.0 + css-what: 6.2.2 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-tree@2.2.1: @@ -14616,159 +15685,112 @@ snapshots: mdn-data: 2.0.28 source-map-js: 1.2.1 - css-tree@2.3.1: + css-tree@3.1.0: dependencies: - mdn-data: 2.0.30 + mdn-data: 2.12.2 source-map-js: 1.2.1 - css-what@6.1.0: {} + css-what@6.2.2: {} cssesc@3.0.0: {} - cssnano-preset-default@7.0.6(postcss@8.4.47): - dependencies: - browserslist: 4.24.2 - css-declaration-sorter: 7.2.0(postcss@8.4.47) - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-calc: 10.0.2(postcss@8.4.47) - postcss-colormin: 7.0.2(postcss@8.4.47) - postcss-convert-values: 7.0.4(postcss@8.4.47) - postcss-discard-comments: 7.0.3(postcss@8.4.47) - postcss-discard-duplicates: 7.0.1(postcss@8.4.47) - postcss-discard-empty: 7.0.0(postcss@8.4.47) - postcss-discard-overridden: 7.0.0(postcss@8.4.47) - postcss-merge-longhand: 7.0.4(postcss@8.4.47) - postcss-merge-rules: 7.0.4(postcss@8.4.47) - postcss-minify-font-values: 7.0.0(postcss@8.4.47) - postcss-minify-gradients: 7.0.0(postcss@8.4.47) - postcss-minify-params: 7.0.2(postcss@8.4.47) - postcss-minify-selectors: 7.0.4(postcss@8.4.47) - postcss-normalize-charset: 7.0.0(postcss@8.4.47) - postcss-normalize-display-values: 7.0.0(postcss@8.4.47) - postcss-normalize-positions: 7.0.0(postcss@8.4.47) - postcss-normalize-repeat-style: 7.0.0(postcss@8.4.47) - postcss-normalize-string: 7.0.0(postcss@8.4.47) - postcss-normalize-timing-functions: 7.0.0(postcss@8.4.47) - postcss-normalize-unicode: 7.0.2(postcss@8.4.47) - postcss-normalize-url: 7.0.0(postcss@8.4.47) - postcss-normalize-whitespace: 7.0.0(postcss@8.4.47) - postcss-ordered-values: 7.0.1(postcss@8.4.47) - postcss-reduce-initial: 7.0.2(postcss@8.4.47) - postcss-reduce-transforms: 7.0.0(postcss@8.4.47) - postcss-svgo: 7.0.1(postcss@8.4.47) - postcss-unique-selectors: 7.0.3(postcss@8.4.47) - - cssnano-utils@5.0.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - - cssnano@7.0.6(postcss@8.4.47): - dependencies: - cssnano-preset-default: 7.0.6(postcss@8.4.47) - lilconfig: 3.1.2 - postcss: 8.4.47 + cssnano-preset-default@7.0.9(postcss@8.5.6): + dependencies: + browserslist: 4.26.3 + css-declaration-sorter: 7.3.0(postcss@8.5.6) + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 10.1.1(postcss@8.5.6) + postcss-colormin: 7.0.4(postcss@8.5.6) + postcss-convert-values: 7.0.7(postcss@8.5.6) + postcss-discard-comments: 7.0.4(postcss@8.5.6) + postcss-discard-duplicates: 7.0.2(postcss@8.5.6) + postcss-discard-empty: 7.0.1(postcss@8.5.6) + postcss-discard-overridden: 7.0.1(postcss@8.5.6) + postcss-merge-longhand: 7.0.5(postcss@8.5.6) + postcss-merge-rules: 7.0.6(postcss@8.5.6) + postcss-minify-font-values: 7.0.1(postcss@8.5.6) + postcss-minify-gradients: 7.0.1(postcss@8.5.6) + postcss-minify-params: 7.0.4(postcss@8.5.6) + postcss-minify-selectors: 7.0.5(postcss@8.5.6) + postcss-normalize-charset: 7.0.1(postcss@8.5.6) + postcss-normalize-display-values: 7.0.1(postcss@8.5.6) + postcss-normalize-positions: 7.0.1(postcss@8.5.6) + postcss-normalize-repeat-style: 7.0.1(postcss@8.5.6) + postcss-normalize-string: 7.0.1(postcss@8.5.6) + postcss-normalize-timing-functions: 7.0.1(postcss@8.5.6) + postcss-normalize-unicode: 7.0.4(postcss@8.5.6) + postcss-normalize-url: 7.0.1(postcss@8.5.6) + postcss-normalize-whitespace: 7.0.1(postcss@8.5.6) + postcss-ordered-values: 7.0.2(postcss@8.5.6) + postcss-reduce-initial: 7.0.4(postcss@8.5.6) + postcss-reduce-transforms: 7.0.1(postcss@8.5.6) + postcss-svgo: 7.1.0(postcss@8.5.6) + postcss-unique-selectors: 7.0.4(postcss@8.5.6) + + cssnano-utils@5.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + cssnano@7.1.1(postcss@8.5.6): + dependencies: + cssnano-preset-default: 7.0.9(postcss@8.5.6) + lilconfig: 3.1.3 + postcss: 8.5.6 csso@5.0.5: dependencies: css-tree: 2.2.1 - cssstyle@4.0.1: + cssstyle@5.3.1(postcss@8.5.6): dependencies: - rrweb-cssom: 0.6.0 + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) + css-tree: 3.1.0 + transitivePeerDependencies: + - postcss csstype@3.1.3: {} - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 + data-uri-to-buffer@4.0.1: {} - dargs@8.1.0: {} + data-uri-to-buffer@6.0.2: {} - data-urls@5.0.0: + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + whatwg-url: 15.1.0 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.25.4 + dataloader@2.2.3: {} date-fns@3.6.0: {} - dateformat@4.6.3: {} - - db0@0.2.1: {} - - de-indent@1.0.2: - optional: true - - debug@2.6.9: - dependencies: - ms: 2.0.0 + date-fns@4.1.0: {} - debug@3.1.0: - dependencies: - ms: 2.0.0 + dateformat@4.6.3: {} - debug@3.2.7: - dependencies: - ms: 2.1.3 + db0@0.3.4(@libsql/client@0.15.15): + optionalDependencies: + '@libsql/client': 0.15.15 - debug@4.3.6: + debug@4.3.4: dependencies: ms: 2.1.2 - debug@4.3.7(supports-color@5.5.0): + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - - debug@4.3.7(supports-color@9.4.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 9.4.0 - - debuglog@1.0.1: {} - - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - decamelize@1.2.0: {} + decamelize@6.0.1: {} - decamelize@5.0.1: {} - - decamelize@6.0.0: {} - - decimal.js@10.4.3: {} + decimal.js@10.6.0: {} decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + dedent@1.7.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -14786,61 +15808,37 @@ snapshots: defer-to-connect@2.0.1: {} - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - define-lazy-prop@2.0.0: {} define-lazy-prop@3.0.0: {} - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - defu@6.1.4: {} - del-cli@5.1.0: + degenerator@5.0.1: dependencies: - del: 7.1.0 - meow: 10.1.5 - - del@7.1.0: - dependencies: - globby: 13.2.2 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 3.0.0 - is-path-inside: 4.0.0 - p-map: 5.5.0 - rimraf: 3.0.2 - slash: 4.0.0 + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 delayed-stream@1.0.0: {} - delegates@1.0.0: {} - denque@2.1.0: {} depd@2.0.0: {} dequal@2.0.3: {} - destr@2.0.3: {} - - destroy@1.2.0: {} + destr@2.0.5: {} detect-libc@1.0.3: {} - detect-libc@2.0.3: {} + detect-libc@2.0.2: {} + + detect-libc@2.1.2: {} - detect-node@2.1.0: {} + detect-newline@3.1.0: {} - devalue@5.1.1: {} + devalue@5.3.2: {} devlop@1.1.0: dependencies: @@ -14851,24 +15849,14 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 - diff@5.2.0: {} + diff@4.0.2: {} - diff@7.0.0: {} + diff@8.0.2: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -14877,55 +15865,48 @@ snapshots: domelementtype@2.3.0: {} - domhandler@3.3.0: - dependencies: - domelementtype: 2.3.0 - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - domhandler@5.0.3: dependencies: domelementtype: 2.3.0 - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dot-prop@9.0.0: + dot-prop@10.1.0: dependencies: - type-fest: 4.25.0 + type-fest: 5.1.0 - dotenv-cli@7.4.2: + dotenv-cli@10.0.0: dependencies: - cross-spawn: 7.0.3 - dotenv: 16.4.5 - dotenv-expand: 10.0.0 + cross-spawn: 7.0.6 + dotenv: 17.2.3 + dotenv-expand: 11.0.7 minimist: 1.2.8 - dotenv-expand@10.0.0: {} + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.6.1 - dotenv@16.4.5: {} + dotenv-expand@12.0.1: + dependencies: + dotenv: 16.4.7 - dottie@2.0.6: {} + dotenv@16.4.7: {} - duplexer@0.1.2: {} + dotenv@16.6.1: {} - duplexify@4.1.3: + dotenv@17.2.3: {} + + dunder-proto@1.0.1: dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} eastasianwidth@0.2.0: {} @@ -14933,35 +15914,20 @@ snapshots: dependencies: safe-buffer: 5.2.1 - editorconfig@1.0.4: - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.6.3 - ee-first@1.1.1: {} - electron-to-chromium@1.5.13: {} - - electron-to-chromium@1.5.55: {} - - email-validator@2.0.4: {} - - emailjs@4.0.3(typescript@5.6.3): - optionalDependencies: - typescript: 5.6.3 + electron-to-chromium@1.5.234: {} emittery@0.13.1: {} - emoji-regex@10.3.0: {} + emoji-regex-xs@1.0.0: {} + + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} - encodeurl@2.0.0: {} encoding@0.1.13: @@ -14969,131 +15935,48 @@ snapshots: iconv-lite: 0.6.3 optional: true - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 - - entities@2.2.0: {} + tapable: 2.3.0 entities@4.5.0: {} + entities@6.0.1: {} + env-paths@2.2.1: {} err-code@2.0.3: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - error-stack-parser-es@0.1.5: {} + error-stack-parser-es@1.0.5: {} errx@0.1.0: {} - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-array-method-boxes-properly@1.0.0: {} - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@1.5.4: {} + es-module-lexer@1.7.0: {} - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-symbol@3.1.4: - dependencies: - d: 1.0.2 - ext: 1.7.0 - - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -15120,209 +16003,207 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - - esbuild@0.24.0: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - - escalade@3.1.2: {} + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 escalade@3.2.0: {} - escape-goat@3.0.0: {} - escape-html@1.0.3: {} escape-regexp-component@1.0.2: {} escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-config-flat-gitignore@0.3.0(eslint@9.14.0(jiti@2.4.0)): + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-config-flat-gitignore@2.1.0(eslint@9.37.0(jiti@2.6.1)): dependencies: - '@eslint/compat': 1.2.2(eslint@9.14.0(jiti@2.4.0)) - eslint: 9.14.0(jiti@2.4.0) - find-up-simple: 1.0.0 + '@eslint/compat': 1.4.0(eslint@9.37.0(jiti@2.6.1)) + eslint: 9.37.0(jiti@2.6.1) - eslint-flat-config-utils@0.4.0: + eslint-flat-config-utils@2.1.4: dependencies: - pathe: 1.1.2 + pathe: 2.0.3 - eslint-import-resolver-node@0.3.9: + eslint-import-context@0.1.9(unrs-resolver@1.11.1): dependencies: - debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color + get-tsconfig: 4.12.0 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-merge-processors@2.0.0(eslint@9.37.0(jiti@2.6.1)): + dependencies: + eslint: 9.37.0(jiti@2.6.1) + + eslint-plugin-import-lite@0.3.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + '@typescript-eslint/types': 8.46.0 + eslint: 9.37.0(jiti@2.6.1) + optionalDependencies: + typescript: 5.9.3 - eslint-plugin-import-x@4.4.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1)): dependencies: - '@typescript-eslint/utils': 8.2.0(eslint@9.14.0(jiti@2.4.0))(typescript@5.6.3) - debug: 4.3.7(supports-color@9.4.0) - doctrine: 3.0.0 - eslint: 9.14.0(jiti@2.4.0) - eslint-import-resolver-node: 0.3.9 - get-tsconfig: 4.7.6 + '@typescript-eslint/types': 8.46.0 + comment-parser: 1.4.1 + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - stable-hash: 0.0.4 - tslib: 2.7.0 + minimatch: 10.0.3 + semver: 7.7.3 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color - - typescript - eslint-plugin-jsdoc@50.4.3(eslint@9.14.0(jiti@2.4.0)): + eslint-plugin-jsdoc@54.7.0(eslint@9.37.0(jiti@2.6.1)): dependencies: - '@es-joy/jsdoccomment': 0.49.0 + '@es-joy/jsdoccomment': 0.56.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 9.14.0(jiti@2.4.0) - espree: 10.3.0 + eslint: 9.37.0(jiti@2.6.1) + espree: 10.4.0 esquery: 1.6.0 - parse-imports: 2.1.1 - semver: 7.6.3 + parse-imports-exports: 0.2.4 + semver: 7.7.3 spdx-expression-parse: 4.0.0 - synckit: 0.9.1 transitivePeerDependencies: - supports-color - eslint-plugin-regexp@2.6.0(eslint@9.14.0(jiti@2.4.0)): + eslint-plugin-regexp@2.10.0(eslint@9.37.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@2.4.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 - eslint: 9.14.0(jiti@2.4.0) - jsdoc-type-pratt-parser: 4.1.0 + eslint: 9.37.0(jiti@2.6.1) + jsdoc-type-pratt-parser: 4.8.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-unicorn@56.0.0(eslint@9.14.0(jiti@2.4.0)): + eslint-plugin-unicorn@60.0.0(eslint@9.37.0(jiti@2.6.1)): dependencies: - '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@2.4.0)) - ci-info: 4.0.0 + '@babel/helper-validator-identifier': 7.27.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + '@eslint/plugin-kit': 0.3.5 + change-case: 5.4.4 + ci-info: 4.3.1 clean-regexp: 1.0.0 - core-js-compat: 3.38.1 - eslint: 9.14.0(jiti@2.4.0) + core-js-compat: 3.46.0 + eslint: 9.37.0(jiti@2.6.1) esquery: 1.6.0 - globals: 15.12.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 + find-up-simple: 1.0.1 + globals: 16.4.0 + indent-string: 5.0.0 + is-builtin-module: 5.0.0 + jsesc: 3.1.0 pluralize: 8.0.0 - read-pkg-up: 7.0.1 regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.6.3 - strip-indent: 3.0.0 + regjsparser: 0.12.0 + semver: 7.7.3 + strip-indent: 4.1.1 - eslint-plugin-vue@9.30.0(eslint@9.14.0(jiti@2.4.0)): + eslint-plugin-vue@10.5.0(@stylistic/eslint-plugin@5.4.0(eslint@9.37.0(jiti@2.6.1)))(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.37.0(jiti@2.6.1))): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@2.4.0)) - eslint: 9.14.0(jiti@2.4.0) - globals: 13.24.0 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) + eslint: 9.37.0(jiti@2.6.1) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.14.0(jiti@2.4.0)) + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@9.37.0(jiti@2.6.1)) xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color + optionalDependencies: + '@stylistic/eslint-plugin': 5.4.0(eslint@9.37.0(jiti@2.6.1)) + '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.6.1))(typescript@5.9.3) + + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.22)(eslint@9.37.0(jiti@2.6.1)): + dependencies: + '@vue/compiler-sfc': 3.5.22 + eslint: 9.37.0(jiti@2.6.1) - eslint-scope@7.2.2: + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 - estraverse: 5.3.0 + estraverse: 4.3.0 - eslint-scope@8.2.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.14.0(jiti@2.4.0): + eslint@9.37.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@2.4.0)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.18.0 - '@eslint/core': 0.7.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.14.0 - '@eslint/plugin-kit': 0.2.2 - '@humanfs/node': 0.16.6 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@9.4.0) + cross-spawn: 7.0.6 + debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -15337,30 +16218,18 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - text-table: 0.2.0 optionalDependencies: - jiti: 2.4.0 + jiti: 2.6.1 transitivePeerDependencies: - supports-color - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - - espree@10.3.0: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 + esm@3.2.25: {} - espree@9.6.1: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -15372,32 +16241,33 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@2.0.2: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} etag@1.8.1: {} - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-target-shim@5.0.1: {} - events@1.1.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.0 + transitivePeerDependencies: + - bare-abort-controller events@3.3.0: {} execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -15409,7 +16279,7 @@ snapshots: execa@6.1.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 3.0.1 is-stream: 3.0.0 @@ -15419,21 +16289,9 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - execa@7.2.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -15443,97 +16301,71 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.5.1: + execa@9.6.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 - human-signals: 8.0.0 + human-signals: 8.0.1 is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.1.0 + pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.1 - - exponential-backoff@3.1.1: {} - - express-rate-limit@7.4.1(express@5.0.0): - dependencies: - express: 5.0.0 + yoctocolors: 2.1.2 - express-session@1.18.1: - dependencies: - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - on-headers: 1.0.2 - parseurl: 1.3.3 - safe-buffer: 5.2.1 - uid-safe: 2.1.5 - transitivePeerDependencies: - - supports-color + exit-x@0.2.2: {} - express@5.0.0: + expect@30.2.0: + dependencies: + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-util: 30.2.0 + + exponential-backoff@3.1.3: {} + + express@5.1.0: dependencies: accepts: 2.0.0 - body-parser: 2.0.1 + body-parser: 2.2.0 content-disposition: 1.0.0 content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.2.1 - debug: 4.3.6 - depd: 2.0.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.0.0 + finalhandler: 2.1.0 fresh: 2.0.0 http-errors: 2.0.0 merge-descriptors: 2.0.0 - methods: 1.1.2 - mime-types: 3.0.0 + mime-types: 3.0.1 on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.13.0 + qs: 6.14.0 range-parser: 1.2.1 - router: 2.0.0 - safe-buffer: 5.2.1 - send: 1.1.0 - serve-static: 2.1.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 2.0.0 - utils-merge: 1.0.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - ext@1.7.0: - dependencies: - type: 2.7.3 - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - externality@1.0.2: - dependencies: - enhanced-resolve: 5.17.1 - mlly: 1.7.2 - pathe: 1.1.2 - ufo: 1.5.4 + exsolve@1.0.7: {} extract-zip@2.0.1: dependencies: - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -15547,7 +16379,7 @@ snapshots: fast-fifo@1.3.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -15559,63 +16391,84 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-npm-meta@0.2.2: {} - - fast-redact@3.5.0: {} + fast-npm-meta@0.4.7: {} fast-safe-stringify@2.1.1: {} - fast-uri@3.0.1: {} + fast-uri@3.1.0: {} + + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 - fast-xml-parser@4.4.1: + fastq@1.19.1: dependencies: - strnum: 1.0.5 + reusify: 1.1.0 - fastq@1.17.1: + fb-watchman@2.0.2: dependencies: - reusify: 1.0.4 + bser: 2.1.1 fd-slicer@1.1.0: dependencies: pend: 1.2.0 - fdir@6.4.0(picomatch@3.0.1): + fdir@6.5.0(picomatch@3.0.1): optionalDependencies: picomatch: 3.0.1 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fecha@4.2.3: {} + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fflate@0.8.2: {} + + figlet@1.9.3: + dependencies: + commander: 14.0.1 + figures@6.1.0: dependencies: - is-unicode-supported: 2.0.0 + is-unicode-supported: 2.1.0 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 + file-type@21.0.0: + dependencies: + '@tokenizer/inflate': 0.2.7 + strtok3: 10.3.4 + token-types: 6.1.1 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + file-uri-to-path@1.0.0: {} fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@2.0.0: + finalhandler@2.1.0: dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 + 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.1 - unpipe: 1.0.0 + statuses: 2.0.2 transitivePeerDependencies: - supports-color - find-up-simple@1.0.0: {} + find-up-simple@1.0.1: {} find-up@4.1.0: dependencies: @@ -15636,80 +16489,84 @@ snapshots: dependencies: aggregate-error: 5.0.0 execa: 8.0.1 - pid-port: 1.0.0 + pid-port: 1.0.2 process-exists: 5.0.0 ps-list: 8.1.1 taskkill: 5.0.0 flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.3: {} - focus-trap@7.6.0: + focus-trap@7.6.5: dependencies: tabbable: 6.2.0 - follow-redirects@1.15.6(debug@4.3.7): + follow-redirects@1.15.11(debug@4.4.3): optionalDependencies: - debug: 4.3.7(supports-color@9.4.0) - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 + debug: 4.4.3 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data-encoder@1.7.2: {} + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.100.2): + dependencies: + '@babel/code-frame': 7.27.1 + chalk: 4.1.2 + chokidar: 4.0.3 + cosmiconfig: 8.3.6(typescript@5.8.3) + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.7.3 + tapable: 2.3.0 + typescript: 5.8.3 + webpack: 5.100.2 - form-data@4.0.0: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 - formdata-node@4.4.1: + formdata-polyfill@4.0.10: dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 + fetch-blob: 3.2.0 + + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.2.2 + dezalgo: 1.0.4 + once: 1.4.0 + + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} fraction.js@4.3.7: {} - fresh@0.5.2: {} - fresh@2.0.0: {} - fs-blob-store@6.0.0: - dependencies: - duplexify: 4.1.3 - end-of-stream: 1.4.4 - lru-cache: 6.0.0 - mkdirp-classic: 0.5.3 - - fs-extra@11.2.0: + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@9.1.0: + fs-extra@11.3.2: dependencies: - at-least-node: 1.0.0 graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-minipass@2.1.0: @@ -15720,6 +16577,8 @@ snapshots: dependencies: minipass: 7.1.2 + fs-monkey@1.1.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -15730,46 +16589,39 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 + fuse.js@7.1.0: {} gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-east-asian-width@1.2.0: {} + get-east-asian-width@1.4.0: {} - get-intrinsic@1.2.4: + 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 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-package-type@0.1.0: {} + + get-port-please@3.2.0: {} - get-port-please@3.1.2: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.3 get-stream@6.0.1: {} @@ -15780,37 +16632,37 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-symbol-description@1.0.2: + get-tsconfig@4.12.0: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 + resolve-pkg-maps: 1.0.0 - get-tsconfig@4.7.6: + get-uri@6.0.5: dependencies: - resolve-pkg-maps: 1.0.0 + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color - giget@1.2.3: + getopts@2.3.0: {} + + giget@2.0.0: dependencies: citty: 0.1.6 - consola: 3.2.3 + consola: 3.4.2 defu: 6.1.4 - node-fetch-native: 1.6.4 - nypm: 0.3.11 - ohash: 1.1.3 - pathe: 1.1.2 - tar: 6.2.1 - - git-config-path@2.0.0: {} + node-fetch-native: 1.6.7 + nypm: 0.6.2 + pathe: 2.0.3 - git-up@7.0.0: + git-up@8.1.1: dependencies: - is-ssh: 1.4.0 - parse-url: 8.1.0 + is-ssh: 1.4.1 + parse-url: 9.2.0 - git-url-parse@15.0.0: + git-url-parse@16.1.0: dependencies: - git-up: 7.0.0 + git-up: 8.1.1 glob-parent@5.1.2: dependencies: @@ -15820,15 +16672,26 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 - package-json-from-dist: 1.0.0 + package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -15842,59 +16705,38 @@ snapshots: dependencies: ini: 4.1.1 - globals@11.12.0: {} - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} - globals@15.12.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 + globals@16.4.0: {} globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 - - globby@14.0.2: + globby@15.0.0: dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.2 - ignore: 5.3.2 - path-type: 5.0.0 + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 slash: 5.1.0 - unicorn-magic: 0.1.0 + unicorn-magic: 0.3.0 - google-fonts-helper@3.6.0: + google-fonts-helper@3.7.3: dependencies: deepmerge: 4.3.1 hookable: 5.5.3 - ofetch: 1.3.4 - ufo: 1.5.4 + ofetch: 1.4.1 + ufo: 1.6.1 google-protobuf@3.21.4: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} got@11.8.6: dependencies: @@ -15914,59 +16756,40 @@ snapshots: graphemer@1.4.0: {} - gravatar@1.8.2: - dependencies: - blueimp-md5: 2.19.0 - email-validator: 2.0.4 - querystring: 0.2.0 - yargs: 15.4.1 + graphql@16.11.0: {} gzip-size@7.0.0: dependencies: duplexer: 0.1.2 - h3@1.13.0: + h3@1.15.4: dependencies: cookie-es: 1.2.2 - crossws: 0.3.1 + crossws: 0.3.5 defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 iron-webcrypto: 1.2.1 - ohash: 1.1.4 + node-mock-http: 1.0.3 radix3: 1.1.2 - ufo: 1.5.4 + ufo: 1.6.1 uncrypto: 0.1.3 - unenv: 1.10.0 - - hard-rejection@2.1.0: {} - - has-bigints@1.0.2: {} - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: + handlebars@4.7.8: dependencies: - es-define-property: 1.0.0 + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 - has-proto@1.0.3: {} + has-flag@4.0.0: {} - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 - - has-unicode@2.0.1: {} - - hash-obj@4.0.0: - dependencies: - is-obj: 3.0.0 - sort-keys: 5.0.0 - type-fest: 1.4.0 - - hash-sum@2.0.0: {} + has-symbols: 1.1.0 hashids@2.3.0: {} @@ -15974,7 +16797,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-to-html@9.0.3: + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -15983,7 +16806,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -15992,20 +16815,12 @@ snapshots: dependencies: '@types/hast': 3.0.4 - he@1.2.0: {} - - helmet@7.1.0: {} + helmet@8.1.0: {} help-me@5.0.0: {} hookable@5.5.3: {} - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -16014,50 +16829,11 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 - html-minifier@4.0.0: - dependencies: - camel-case: 3.0.0 - clean-css: 4.2.4 - commander: 2.20.3 - he: 1.2.0 - param-case: 2.1.1 - relateurl: 0.2.7 - uglify-js: 3.19.2 - - html-tags@3.3.1: {} - - html-to-text@9.0.5: - dependencies: - '@selderee/plugin-htmlparser2': 0.11.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.11.0 + html-escaper@2.0.2: {} html-void-elements@3.0.0: {} - htmlparser2@5.0.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 3.3.0 - domutils: 2.8.0 - entities: 2.2.0 - - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - - htmlparser2@9.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - - http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} http-errors@2.0.0: dependencies: @@ -16069,114 +16845,98 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1(supports-color@9.4.0) - debug: 4.3.7(supports-color@9.4.0) + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color http-shutdown@1.2.2: {} - http-status-codes@2.3.0: {} - http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5(supports-color@9.4.0): + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1(supports-color@9.4.0) - debug: 4.3.7(supports-color@9.4.0) + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color - httpxy@0.1.5: {} + httpxy@0.1.7: {} human-signals@2.1.0: {} human-signals@3.0.1: {} - human-signals@4.3.1: {} - human-signals@5.0.0: {} - human-signals@8.0.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - humanize-string@3.0.0: - dependencies: - decamelize: 6.0.0 + human-signals@8.0.1: {} - iconv-lite@0.4.24: + humanize-string@3.1.0: dependencies: - safer-buffer: 2.1.2 + decamelize: 6.0.1 - iconv-lite@0.5.2: + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + iconv-lite@0.7.0: dependencies: safer-buffer: 2.1.2 - ieee754@1.1.13: {} - ieee754@1.2.1: {} - ignore-by-default@1.0.1: {} - ignore-walk@6.0.5: dependencies: minimatch: 9.0.5 ignore@5.3.2: {} - ignore@6.0.2: {} + ignore@7.0.5: {} - image-meta@0.2.1: {} + image-meta@0.2.2: {} - image-size@1.1.1: + image-size@1.2.1: dependencies: queue: 6.0.2 - immediate@3.0.6: {} + immutable@5.1.4: {} - immutable@4.3.7: {} - - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.11.0: + import-in-the-middle@1.15.0: dependencies: - acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) - cjs-module-lexer: 1.4.0 - module-details-from-path: 1.0.3 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 import-lazy@4.0.0: {} + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + impound@1.0.0: + dependencies: + exsolve: 1.0.7 + mocked-exports: 0.1.1 + pathe: 2.0.3 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 + imurmurhash@0.1.4: {} indent-string@4.0.0: {} indent-string@5.0.0: {} - index-to-position@0.1.2: {} - - inflection@1.13.4: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -16184,42 +16944,31 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} - ini@2.0.0: {} ini@4.1.1: {} ini@4.1.3: {} - inquirer@9.3.6: - dependencies: - '@inquirer/figures': 1.0.5 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - external-editor: 3.1.0 - mute-stream: 1.0.0 - ora: 5.4.1 - run-async: 3.0.0 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 - - internal-slot@1.0.7: + inquirer@12.9.6(@types/node@24.7.2): dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 + '@inquirer/ansi': 1.0.0 + '@inquirer/core': 10.2.2(@types/node@24.7.2) + '@inquirer/prompts': 7.8.6(@types/node@24.7.2) + '@inquirer/type': 3.0.8(@types/node@24.7.2) + mute-stream: 2.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 24.7.2 - interpret@1.4.0: {} + interpret@2.2.0: {} - ioredis@5.4.1: + ioredis@5.8.1: dependencies: - '@ioredis/commands': 1.2.0 + '@ioredis/commands': 1.4.0 cluster-key-slot: 1.1.2 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.3 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -16229,60 +16978,24 @@ snapshots: transitivePeerDependencies: - supports-color - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ip-address@10.0.1: {} ipaddr.js@1.9.1: {} iron-webcrypto@1.2.1: {} - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-arrayish@0.2.1: {} - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-blob@2.1.0: {} - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-builtin-module@3.2.1: + is-builtin-module@5.0.0: dependencies: - builtin-modules: 3.3.0 - - is-callable@1.2.7: {} + builtin-modules: 5.0.0 - is-core-module@2.15.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -16291,9 +17004,7 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 + is-generator-fn@2.1.0: {} is-glob@4.0.3: dependencies: @@ -16318,138 +17029,438 @@ snapshots: is-module@1.0.0: {} - is-negative-zero@2.0.3: {} + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@4.1.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-promise@4.0.0: {} - is-number-object@1.0.7: + is-reference@1.2.1: dependencies: - has-tostringtag: 1.0.2 + '@types/estree': 1.0.8 - is-number@7.0.0: {} + is-ssh@1.4.1: + dependencies: + protocols: 2.0.2 - is-obj@3.0.0: {} + is-stream@2.0.1: {} - is-path-cwd@3.0.0: {} + is-stream@3.0.0: {} - is-path-inside@4.0.0: {} + is-stream@4.0.1: {} - is-plain-obj@1.1.0: {} + is-unicode-supported@0.1.0: {} - is-plain-obj@4.1.0: {} + is-unicode-supported@2.1.0: {} - is-potential-custom-element-name@1.0.1: {} + is-wayland@0.1.0: {} + + is-what@4.1.16: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is64bit@2.0.0: + dependencies: + system-architecture: 0.1.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.4 + '@babel/parser': 7.28.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterare@1.2.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 - is-promise@2.2.2: {} + jest-changed-files@30.2.0: + dependencies: + execa: 5.1.1 + jest-util: 30.2.0 + p-limit: 3.1.0 - is-promise@4.0.0: {} + jest-circus@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/expect': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.7.0 + is-generator-fn: 2.1.0 + jest-each: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-runtime: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + p-limit: 3.1.0 + pretty-format: 30.2.0 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color - is-reference@1.2.1: + jest-cli@30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: - '@types/estree': 1.0.6 + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + jest-util: 30.2.0 + jest-validate: 30.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node - is-regex@1.1.4: + jest-config@30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + '@babel/core': 7.28.4 + '@jest/get-type': 30.1.0 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + ci-info: 4.3.1 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.2.0 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-runner: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.2.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 24.7.2 + ts-node: 10.9.2(@types/node@24.7.2)(typescript@5.9.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color - is-shared-array-buffer@1.0.3: + jest-diff@30.2.0: dependencies: - call-bind: 1.0.7 + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + pretty-format: 30.2.0 - is-ssh@1.4.0: + jest-docblock@30.2.0: dependencies: - protocols: 2.0.1 + detect-newline: 3.1.0 - is-stream@2.0.1: {} + jest-each@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + chalk: 4.1.2 + jest-util: 30.2.0 + pretty-format: 30.2.0 - is-stream@3.0.0: {} + jest-environment-node@30.2.0: + dependencies: + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + jest-mock: 30.2.0 + jest-util: 30.2.0 + jest-validate: 30.2.0 - is-stream@4.0.1: {} + jest-haste-map@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.2.0 + jest-worker: 30.2.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 - is-string@1.0.7: + jest-leak-detector@30.2.0: dependencies: - has-tostringtag: 1.0.2 + '@jest/get-type': 30.1.0 + pretty-format: 30.2.0 - is-symbol@1.0.4: + jest-matcher-utils@30.2.0: dependencies: - has-symbols: 1.0.3 + '@jest/get-type': 30.1.0 + chalk: 4.1.2 + jest-diff: 30.2.0 + pretty-format: 30.2.0 - is-typed-array@1.1.13: + jest-message-util@30.2.0: dependencies: - which-typed-array: 1.1.15 + '@babel/code-frame': 7.27.1 + '@jest/types': 30.2.0 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.2.0 + slash: 3.0.0 + stack-utils: 2.0.6 - is-unicode-supported@0.1.0: {} + jest-mock@30.2.0: + dependencies: + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + jest-util: 30.2.0 - is-unicode-supported@1.3.0: {} + jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): + optionalDependencies: + jest-resolve: 30.2.0 - is-unicode-supported@2.0.0: {} + jest-regex-util@30.0.1: {} - is-weakref@1.0.2: + jest-resolve-dependencies@30.2.0: dependencies: - call-bind: 1.0.7 - - is-what@4.1.16: {} + jest-regex-util: 30.0.1 + jest-snapshot: 30.2.0 + transitivePeerDependencies: + - supports-color - is-wsl@2.2.0: + jest-resolve@30.2.0: dependencies: - is-docker: 2.2.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-pnp-resolver: 1.2.3(jest-resolve@30.2.0) + jest-util: 30.2.0 + jest-validate: 30.2.0 + slash: 3.0.0 + unrs-resolver: 1.11.1 - is-wsl@3.1.0: + jest-runner@30.2.0: dependencies: - is-inside-container: 1.0.0 + '@jest/console': 30.2.0 + '@jest/environment': 30.2.0 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.2.0 + jest-environment-node: 30.2.0 + jest-haste-map: 30.2.0 + jest-leak-detector: 30.2.0 + jest-message-util: 30.2.0 + jest-resolve: 30.2.0 + jest-runtime: 30.2.0 + jest-util: 30.2.0 + jest-watcher: 30.2.0 + jest-worker: 30.2.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color - is64bit@2.0.0: + jest-runtime@30.2.0: dependencies: - system-architecture: 0.1.0 - - isarray@1.0.0: {} - - isarray@2.0.5: {} - - isexe@2.0.0: {} + '@jest/environment': 30.2.0 + '@jest/fake-timers': 30.2.0 + '@jest/globals': 30.2.0 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.2.0 + jest-message-util: 30.2.0 + jest-mock: 30.2.0 + jest-regex-util: 30.0.1 + jest-resolve: 30.2.0 + jest-snapshot: 30.2.0 + jest-util: 30.2.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color - isexe@3.1.1: {} + jest-snapshot@30.2.0: + dependencies: + '@babel/core': 7.28.4 + '@babel/generator': 7.28.3 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.28.4 + '@jest/expect-utils': 30.2.0 + '@jest/get-type': 30.1.0 + '@jest/snapshot-utils': 30.2.0 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) + chalk: 4.1.2 + expect: 30.2.0 + graceful-fs: 4.2.11 + jest-diff: 30.2.0 + jest-matcher-utils: 30.2.0 + jest-message-util: 30.2.0 + jest-util: 30.2.0 + pretty-format: 30.2.0 + semver: 7.7.3 + synckit: 0.11.11 + transitivePeerDependencies: + - supports-color - jackspeak@3.4.3: + jest-util@30.2.0: dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + chalk: 4.1.2 + ci-info: 4.3.1 + graceful-fs: 4.2.11 + picomatch: 4.0.3 - jiti@1.21.6: {} + jest-validate@30.2.0: + dependencies: + '@jest/get-type': 30.1.0 + '@jest/types': 30.2.0 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.2.0 - jiti@2.4.0: {} + jest-watcher@30.2.0: + dependencies: + '@jest/test-result': 30.2.0 + '@jest/types': 30.2.0 + '@types/node': 24.7.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.2.0 + string-length: 4.0.2 - jju@1.4.0: {} + jest-worker@27.5.1: + dependencies: + '@types/node': 24.7.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 - jmespath@0.16.0: {} + jest-worker@30.2.0: + dependencies: + '@types/node': 24.7.2 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.2.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 - joi@17.13.3: + jest@30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)): dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 + '@jest/core': 30.2.0(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + '@jest/types': 30.2.0 + import-local: 3.2.0 + jest-cli: 30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node - jose@4.15.9: {} + jiti@2.6.1: {} - joycon@3.1.1: {} + jju@1.4.0: {} - js-beautify@1.15.1: + joi@18.0.1: dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 10.4.5 - js-cookie: 3.0.5 - nopt: 7.2.1 + '@hapi/address': 5.1.1 + '@hapi/formula': 3.0.2 + '@hapi/hoek': 11.0.7 + '@hapi/pinpoint': 2.0.1 + '@hapi/tlds': 1.1.3 + '@hapi/topo': 6.0.2 + '@standard-schema/spec': 1.0.0 - js-cookie@3.0.5: {} + joycon@3.1.1: {} - js-levenshtein@1.1.6: {} + js-base64@3.7.8: {} js-tokens@4.0.0: {} - js-tokens@9.0.0: {} + js-tokens@9.0.1: {} js-yaml@3.14.1: dependencies: @@ -16460,44 +17471,42 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} + jsdoc-type-pratt-parser@4.8.0: {} - jsdoc-type-pratt-parser@4.1.0: {} + jsdoc-type-pratt-parser@5.1.1: {} - jsdom@24.1.3: + jsdom@27.0.0(postcss@8.5.6): dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 + '@asamuzakjp/dom-selector': 6.6.2 + cssstyle: 5.3.1(postcss@8.5.6) + data-urls: 6.0.0 + decimal.js: 10.6.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5(supports-color@9.4.0) + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 - parse5: 7.1.2 - rrweb-cssom: 0.7.1 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 4.1.4 + tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 + webidl-conversions: 8.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.18.0 + whatwg-url: 15.1.0 + ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil + - postcss - supports-color - utf-8-validate - jsesc@0.5.0: {} - - jsesc@2.5.2: {} - jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -16514,11 +17523,9 @@ snapshots: json5@2.2.3: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 + jsonc-parser@3.3.1: {} - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -16526,6 +17533,8 @@ snapshots: jsonparse@1.3.1: {} + jsonpointer@5.0.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -16537,30 +17546,13 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.3 - - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - - juice@10.0.1(encoding@0.1.13): - dependencies: - cheerio: 1.0.0-rc.12 - commander: 6.2.1 - mensch: 0.3.4 - slick: 1.12.2 - web-resource-inliner: 6.0.1(encoding@0.1.13) - transitivePeerDependencies: - - encoding + semver: 7.7.3 just-diff-apply@5.5.0: {} just-diff@6.0.2: {} - jwa@1.4.1: + jwa@1.4.2: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 @@ -16568,87 +17560,113 @@ snapshots: jws@3.2.2: dependencies: - jwa: 1.4.1 + jwa: 1.4.2 safe-buffer: 5.2.1 keyv@4.5.4: dependencies: json-buffer: 3.0.1 - keyv@5.1.3: - dependencies: - '@keyv/serialize': 1.0.1 - - kind-of@6.0.3: {} - kleur@3.0.3: {} - klona@2.0.6: {} - - knitwork@1.1.0: {} + kleur@4.1.5: {} - kolorist@1.8.0: {} + klona@2.0.6: {} - launch-editor@2.8.1: + knex@3.1.0(pg@8.16.3): dependencies: - picocolors: 1.0.1 - shell-quote: 1.8.1 + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.2.0 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.17.21 + pg-connection-string: 2.6.2 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.0.2 + tildify: 2.0.0 + optionalDependencies: + pg: 8.16.3 + transitivePeerDependencies: + - supports-color - launch-editor@2.9.1: + knitwork@1.2.0: {} + + launch-editor@2.11.1: dependencies: - picocolors: 1.1.0 - shell-quote: 1.8.1 + picocolors: 1.1.1 + shell-quote: 1.8.3 lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - leac@0.6.0: {} + leven@3.1.0: {} levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lie@3.3.0: - dependencies: - immediate: 3.0.6 + libphonenumber-js@1.12.24: {} - lilconfig@3.1.2: {} + libsql@0.5.22: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.5.22 + '@libsql/darwin-x64': 0.5.22 + '@libsql/linux-arm-gnueabihf': 0.5.22 + '@libsql/linux-arm-musleabihf': 0.5.22 + '@libsql/linux-arm64-gnu': 0.5.22 + '@libsql/linux-arm64-musl': 0.5.22 + '@libsql/linux-x64-gnu': 0.5.22 + '@libsql/linux-x64-musl': 0.5.22 + '@libsql/win32-x64-msvc': 0.5.22 + + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} - lines-and-columns@2.0.4: {} - linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 listhen@1.9.0: dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.4.1 + '@parcel/watcher': 2.5.1 + '@parcel/watcher-wasm': 2.5.1 citty: 0.1.6 clipboardy: 4.0.0 - consola: 3.2.3 - crossws: 0.3.1 + consola: 3.4.2 + crossws: 0.3.5 defu: 6.1.4 - get-port-please: 3.1.2 - h3: 1.13.0 + get-port-please: 3.2.0 + h3: 1.15.4 http-shutdown: 1.2.2 - jiti: 2.4.0 - mlly: 1.7.2 + jiti: 2.6.1 + mlly: 1.8.0 node-forge: 1.3.1 pathe: 1.1.2 - std-env: 3.7.0 - ufo: 1.5.4 + std-env: 3.9.0 + ufo: 1.6.1 untun: 0.1.3 uqr: 0.1.2 - local-pkg@0.5.0: + load-esm@1.0.2: {} + + loader-runner@4.3.1: {} + + local-pkg@1.1.2: dependencies: - mlly: 1.7.1 - pkg-types: 1.2.0 + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 locate-path@5.0.0: dependencies: @@ -16672,8 +17690,6 @@ snapshots: lodash.isboolean@3.0.3: {} - lodash.isequal@4.5.0: {} - lodash.isinteger@4.0.4: {} lodash.isnumber@3.0.3: {} @@ -16697,19 +17713,19 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-symbols@6.0.0: + log-symbols@7.0.1: dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 - long@5.2.3: {} - - lower-case@1.1.4: {} + long@5.3.2: {} lowercase-keys@2.0.0: {} lru-cache@10.4.3: {} + lru-cache@11.2.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -16718,66 +17734,66 @@ snapshots: dependencies: yallist: 4.0.0 - lru-queue@0.1.0: + magic-regexp@0.10.0: dependencies: - es5-ext: 0.10.64 - - luxon@3.5.0: {} - - magic-string-ast@0.6.2: - dependencies: - magic-string: 0.30.12 + estree-walker: 3.0.3 + magic-string: 0.30.19 + mlly: 1.8.0 + regexp-tree: 0.1.27 + type-level-regexp: 0.1.17 + ufo: 1.6.1 + unplugin: 2.3.10 - magic-string@0.30.11: + magic-string-ast@1.0.3: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + magic-string: 0.30.19 - magic-string@0.30.12: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.4: + magic-string@0.30.19: dependencies: - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 - source-map-js: 1.2.0 + '@jridgewell/sourcemap-codec': 1.5.5 magicast@0.3.5: dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 source-map-js: 1.2.1 - mailtrap@3.4.0: + mailtrap@4.3.0: dependencies: - axios: 1.7.7(debug@4.3.7) + axios: 1.12.2(debug@4.4.3) transitivePeerDependencies: - debug - make-dir@3.1.0: + make-dir@4.0.0: dependencies: - semver: 6.3.1 + semver: 7.7.3 + + make-error@1.3.6: {} make-fetch-happen@13.0.1: dependencies: '@npmcli/agent': 2.2.2 cacache: 18.0.4 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 is-lambda: 1.0.1 minipass: 7.1.2 minipass-fetch: 3.0.5 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.3 + negotiator: 0.6.4 proc-log: 4.2.0 promise-retry: 2.0.1 ssri: 10.0.6 transitivePeerDependencies: - supports-color - map-obj@1.0.1: {} - - map-obj@4.3.0: {} + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 mark.js@8.11.1: {} @@ -16790,13 +17806,38 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + massimo-cli@1.0.1: + dependencies: + '@fastify/error': 4.2.0 + camelcase: 6.3.0 + code-block-writer: 13.0.3 + graphql: 16.11.0 + help-me: 5.0.0 + jsonpointer: 5.0.1 + massimo: 1.0.1 + minimist: 1.2.8 + pino: 9.13.1 + pino-pretty: 13.1.2 + undici: 7.16.0 + yaml: 2.8.1 + + massimo@1.0.1: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.9.3 + '@fastify/error': 4.2.0 + ajv: 8.17.1 + camelcase: 6.3.0 + undici: 7.16.0 + + math-intrinsics@1.1.0: {} + mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -16804,471 +17845,142 @@ snapshots: mdn-data@2.0.28: {} - mdn-data@2.0.30: {} + mdn-data@2.12.2: {} mdurl@2.0.0: {} media-typer@0.3.0: {} - media-typer@1.1.0: {} - - memoizee@0.4.17: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.8 - - mensch@0.3.4: {} - - meow@10.1.5: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 7.0.2 - decamelize: 5.0.1 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 8.0.0 - redent: 4.0.0 - trim-newlines: 4.1.1 - type-fest: 1.4.0 - yargs-parser: 20.2.9 - - merge-descriptors@2.0.0: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - methods@1.1.2: {} - - micromark-util-character@2.1.0: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-encode@2.0.0: {} - - micromark-util-sanitize-uri@2.0.0: - dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - - micromark-util-symbol@2.0.0: {} - - micromark-util-types@2.0.0: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.53.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.0: - dependencies: - mime-db: 1.53.0 - - mime@1.6.0: {} - - mime@2.6.0: {} - - mime@3.0.0: {} - - mime@4.0.4: {} - - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} - - mimic-function@5.0.1: {} - - mimic-response@1.0.1: {} - - mimic-response@3.1.0: {} - - min-indent@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.1: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.8: {} - - minipass-collect@2.0.1: - dependencies: - minipass: 7.1.2 - - minipass-fetch@3.0.5: - dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 + media-typer@1.1.0: {} - minipass@3.3.6: + memfs@3.5.3: dependencies: - yallist: 4.0.0 + fs-monkey: 1.1.0 - minipass@5.0.0: {} + merge-descriptors@2.0.0: {} - minipass@7.1.2: {} + merge-stream@2.0.0: {} - minisearch@7.1.0: {} + merge2@1.4.1: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + mersenne-twister@1.1.0: {} - mitt@3.0.1: {} + methods@1.1.2: {} - mjml-accordion@4.15.3(encoding@0.1.13): + micromark-util-character@2.1.1: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - mjml-body@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + micromark-util-encode@2.0.1: {} - mjml-button@4.15.3(encoding@0.1.13): + micromark-util-sanitize-uri@2.0.1: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - mjml-carousel@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + micromark-util-symbol@2.0.1: {} - mjml-cli@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - chokidar: 3.6.0 - glob: 10.4.5 - html-minifier: 4.0.0 - js-beautify: 1.15.1 - lodash: 4.17.21 - minimatch: 9.0.5 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-parser-xml: 4.15.3 - mjml-validator: 4.15.3 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding + micromark-util-types@2.0.2: {} - mjml-column@4.15.3(encoding@0.1.13): + micromatch@4.0.8: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + braces: 3.0.3 + picomatch: 2.3.1 - mjml-core@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - cheerio: 1.0.0-rc.12 - detect-node: 2.1.0 - html-minifier: 4.0.0 - js-beautify: 1.15.1 - juice: 10.0.1(encoding@0.1.13) - lodash: 4.17.21 - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-parser-xml: 4.15.3 - mjml-validator: 4.15.3 - transitivePeerDependencies: - - encoding + mikro-orm@6.5.8: {} - mjml-divider@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime-db@1.52.0: {} - mjml-group@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime-db@1.54.0: {} - mjml-head-attributes@4.15.3(encoding@0.1.13): + mime-types@2.1.35: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime-db: 1.52.0 - mjml-head-breakpoint@4.15.3(encoding@0.1.13): + mime-types@3.0.1: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime-db: 1.54.0 - mjml-head-font@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime@2.6.0: {} - mjml-head-html-attributes@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime@3.0.0: {} - mjml-head-preview@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime@4.1.0: {} - mjml-head-style@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mimic-fn@2.1.0: {} - mjml-head-title@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mimic-fn@4.0.0: {} - mjml-head@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mimic-function@5.0.1: {} - mjml-hero@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mimic-response@1.0.1: {} - mjml-image@4.15.3(encoding@0.1.13): + mimic-response@3.1.0: {} + + minimatch@10.0.3: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + '@isaacs/brace-expansion': 5.0.0 - mjml-migrate@4.15.3(encoding@0.1.13): + minimatch@3.1.2: dependencies: - '@babel/runtime': 7.25.4 - js-beautify: 1.15.1 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-parser-xml: 4.15.3 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding + brace-expansion: 1.1.12 - mjml-navbar@4.15.3(encoding@0.1.13): + minimatch@5.1.6: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + brace-expansion: 2.0.2 - mjml-parser-xml@4.15.3: + minimatch@9.0.5: dependencies: - '@babel/runtime': 7.25.4 - detect-node: 2.1.0 - htmlparser2: 9.1.0 - lodash: 4.17.21 + brace-expansion: 2.0.2 - mjml-preset-core@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.25.4 - mjml-accordion: 4.15.3(encoding@0.1.13) - mjml-body: 4.15.3(encoding@0.1.13) - mjml-button: 4.15.3(encoding@0.1.13) - mjml-carousel: 4.15.3(encoding@0.1.13) - mjml-column: 4.15.3(encoding@0.1.13) - mjml-divider: 4.15.3(encoding@0.1.13) - mjml-group: 4.15.3(encoding@0.1.13) - mjml-head: 4.15.3(encoding@0.1.13) - mjml-head-attributes: 4.15.3(encoding@0.1.13) - mjml-head-breakpoint: 4.15.3(encoding@0.1.13) - mjml-head-font: 4.15.3(encoding@0.1.13) - mjml-head-html-attributes: 4.15.3(encoding@0.1.13) - mjml-head-preview: 4.15.3(encoding@0.1.13) - mjml-head-style: 4.15.3(encoding@0.1.13) - mjml-head-title: 4.15.3(encoding@0.1.13) - mjml-hero: 4.15.3(encoding@0.1.13) - mjml-image: 4.15.3(encoding@0.1.13) - mjml-navbar: 4.15.3(encoding@0.1.13) - mjml-raw: 4.15.3(encoding@0.1.13) - mjml-section: 4.15.3(encoding@0.1.13) - mjml-social: 4.15.3(encoding@0.1.13) - mjml-spacer: 4.15.3(encoding@0.1.13) - mjml-table: 4.15.3(encoding@0.1.13) - mjml-text: 4.15.3(encoding@0.1.13) - mjml-wrapper: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minimist@1.2.8: {} - mjml-raw@4.15.3(encoding@0.1.13): + minipass-collect@2.0.1: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 7.1.2 - mjml-section@4.15.3(encoding@0.1.13): + minipass-fetch@3.0.5: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 - mjml-social@4.15.3(encoding@0.1.13): + minipass-flush@1.0.5: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 3.3.6 - mjml-spacer@4.15.3(encoding@0.1.13): + minipass-pipeline@1.2.4: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 3.3.6 - mjml-table@4.15.3(encoding@0.1.13): + minipass-sized@1.0.3: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 3.3.6 - mjml-text@4.15.3(encoding@0.1.13): + minipass@3.3.6: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + yallist: 4.0.0 - mjml-validator@4.15.3: - dependencies: - '@babel/runtime': 7.25.4 + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minisearch@7.2.0: {} - mjml-wrapper@4.15.3(encoding@0.1.13): + minizlib@2.1.2: dependencies: - '@babel/runtime': 7.25.4 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-section: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 3.3.6 + yallist: 4.0.0 - mjml@4.15.3(encoding@0.1.13): + minizlib@3.1.0: dependencies: - '@babel/runtime': 7.25.4 - mjml-cli: 4.15.3(encoding@0.1.13) - mjml-core: 4.15.3(encoding@0.1.13) - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-preset-core: 4.15.3(encoding@0.1.13) - mjml-validator: 4.15.3 - transitivePeerDependencies: - - encoding + minipass: 7.1.2 - mkdirp-classic@0.5.3: {} + mitt@3.0.1: {} mkdirp@0.5.6: dependencies: @@ -17276,141 +17988,136 @@ snapshots: mkdirp@1.0.4: {} - mkdirp@3.0.1: {} - - mlly@1.7.1: - dependencies: - acorn: 8.12.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - ufo: 1.5.4 - - mlly@1.7.2: + mlly@1.8.0: dependencies: - acorn: 8.14.0 - pathe: 1.1.2 - pkg-types: 1.2.1 - ufo: 1.5.4 + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 - module-details-from-path@1.0.3: {} + mocked-exports@0.1.1: {} - moment-timezone@0.5.45: - dependencies: - moment: 2.30.1 + module-details-from-path@1.0.4: {} moment@2.30.1: {} - mri@1.2.0: {} - - mrmime@2.0.0: {} - - ms@2.0.0: {} + mrmime@2.0.1: {} ms@2.1.2: {} ms@2.1.3: {} - muggle-string@0.4.1: - optional: true + muggle-string@0.4.1: {} - multer@1.4.5-lts.1: + multer@2.0.2: dependencies: append-field: 1.0.0 busboy: 1.6.0 - concat-stream: 1.6.2 + concat-stream: 2.0.0 mkdirp: 0.5.6 object-assign: 4.1.1 type-is: 1.6.18 xtend: 4.0.2 - mustache@4.2.0: {} + mute-stream@2.0.0: {} + + nanoid@3.3.11: {} - mute-stream@1.0.0: {} + nanoid@5.1.6: {} - nanoid@3.3.7: {} + nanotar@0.2.0: {} - nanoid@5.0.7: {} + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} - negotiator@0.6.3: {} + negotiator@0.6.4: {} negotiator@1.0.0: {} - next-tick@1.1.0: {} - - nitropack@2.10.3(encoding@0.1.13)(typescript@5.6.3)(webpack-sources@3.2.3)(xml2js@0.6.2): - dependencies: - '@cloudflare/kv-asset-handler': 0.3.4 - '@netlify/functions': 2.8.2 - '@rollup/plugin-alias': 5.1.1(rollup@4.24.4) - '@rollup/plugin-commonjs': 28.0.1(rollup@4.24.4) - '@rollup/plugin-inject': 5.0.5(rollup@4.24.4) - '@rollup/plugin-json': 6.1.0(rollup@4.24.4) - '@rollup/plugin-node-resolve': 15.3.0(rollup@4.24.4) - '@rollup/plugin-replace': 6.0.1(rollup@4.24.4) - '@rollup/plugin-terser': 0.4.4(rollup@4.24.4) - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) - '@types/http-proxy': 1.17.15 - '@vercel/nft': 0.27.6(encoding@0.1.13) + neo-async@2.6.2: {} + + nestjs-pino@4.4.1(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@10.5.0)(pino@9.13.1)(rxjs@7.8.2): + dependencies: + '@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + pino: 9.13.1 + pino-http: 10.5.0 + rxjs: 7.8.2 + + netmask@2.0.2: {} + + nitropack@2.12.7(@libsql/client@0.15.15)(encoding@0.1.13): + dependencies: + '@cloudflare/kv-asset-handler': 0.4.0 + '@rollup/plugin-alias': 5.1.1(rollup@4.52.4) + '@rollup/plugin-commonjs': 28.0.6(rollup@4.52.4) + '@rollup/plugin-inject': 5.0.5(rollup@4.52.4) + '@rollup/plugin-json': 6.1.0(rollup@4.52.4) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.52.4) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.4) + '@rollup/plugin-terser': 0.4.4(rollup@4.52.4) + '@vercel/nft': 0.30.2(encoding@0.1.13)(rollup@4.52.4) archiver: 7.0.1 - c12: 2.0.1(magicast@0.3.5) - chokidar: 3.6.0 + c12: 3.3.0(magicast@0.3.5) + chokidar: 4.0.3 citty: 0.1.6 - compatx: 0.1.8 - confbox: 0.1.8 - consola: 3.2.3 - cookie-es: 1.2.2 - croner: 9.0.0 - crossws: 0.3.1 - db0: 0.2.1 + compatx: 0.2.0 + confbox: 0.2.2 + consola: 3.4.2 + cookie-es: 2.0.0 + croner: 9.1.0 + crossws: 0.3.5 + db0: 0.3.4(@libsql/client@0.15.15) defu: 6.1.4 - destr: 2.0.3 - dot-prop: 9.0.0 - esbuild: 0.24.0 + destr: 2.0.5 + dot-prop: 10.1.0 + esbuild: 0.25.10 escape-string-regexp: 5.0.0 etag: 1.8.1 - fs-extra: 11.2.0 - globby: 14.0.2 + exsolve: 1.0.7 + globby: 15.0.0 gzip-size: 7.0.0 - h3: 1.13.0 + h3: 1.15.4 hookable: 5.5.3 - httpxy: 0.1.5 - ioredis: 5.4.1 - jiti: 2.4.0 + httpxy: 0.1.7 + ioredis: 5.8.1 + jiti: 2.6.1 klona: 2.0.6 - knitwork: 1.1.0 + knitwork: 1.2.0 listhen: 1.9.0 - magic-string: 0.30.12 + magic-string: 0.30.19 magicast: 0.3.5 - mime: 4.0.4 - mlly: 1.7.2 - node-fetch-native: 1.6.4 + mime: 4.1.0 + mlly: 1.8.0 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.3 ofetch: 1.4.1 - ohash: 1.1.4 - openapi-typescript: 7.4.2(encoding@0.1.13)(typescript@5.6.3) - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.1 - pretty-bytes: 6.1.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + pretty-bytes: 7.1.0 radix3: 1.1.2 - rollup: 4.24.4 - rollup-plugin-visualizer: 5.12.0(rollup@4.24.4) + rollup: 4.52.4 + rollup-plugin-visualizer: 6.0.4(rollup@4.52.4) scule: 1.3.0 - semver: 7.6.3 + semver: 7.7.3 serve-placeholder: 2.0.2 - serve-static: 1.16.2 - std-env: 3.7.0 - ufo: 1.5.4 + serve-static: 2.2.0 + source-map: 0.7.6 + std-env: 3.9.0 + ufo: 1.6.1 + ultrahtml: 1.6.0 uncrypto: 0.1.3 - unctx: 2.3.1(webpack-sources@3.2.3) - unenv: 1.10.0 - unimport: 3.13.1(rollup@4.24.4)(webpack-sources@3.2.3) - unstorage: 1.13.1(ioredis@5.4.1) - untyped: 1.5.1 - unwasm: 0.3.9(webpack-sources@3.2.3) - optionalDependencies: - xml2js: 0.6.2 + unctx: 2.4.1 + unenv: 2.0.0-rc.21 + unimport: 5.4.1 + unplugin-utils: 0.3.1 + unstorage: 1.17.1(db0@0.3.4(@libsql/client@0.15.15))(ioredis@5.8.1) + untyped: 2.0.0 + unwasm: 0.3.11 + youch: 4.1.0-beta.11 + youch-core: 0.3.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17419,32 +18126,45 @@ snapshots: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@electric-sql/pglite' - '@libsql/client' - '@netlify/blobs' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' + - aws4fetch + - bare-abort-controller - better-sqlite3 - drizzle-orm - encoding - idb-keyval - mysql2 + - react-native-b4a + - rolldown + - sqlite3 - supports-color - - typescript - - webpack-sources + - uploadthing - no-case@2.3.2: + node-abi@3.78.0: dependencies: - lower-case: 1.1.4 + semver: 7.7.3 - node-addon-api@5.1.0: {} + node-abort-controller@3.1.1: {} node-addon-api@7.1.1: {} + node-addon-api@8.5.0: {} + node-domexception@1.0.0: {} - node-fetch-native@1.6.4: {} + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + + node-fetch-native@1.6.7: {} node-fetch@2.7.0(encoding@0.1.13): dependencies: @@ -17452,66 +18172,51 @@ snapshots: optionalDependencies: encoding: 0.1.13 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-forge@1.3.1: {} - node-gyp-build@4.8.1: {} + node-gyp-build@4.8.4: {} - node-gyp@10.2.0: + node-gyp@10.3.1: dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.1 + exponential-backoff: 3.1.3 glob: 10.4.5 graceful-fs: 4.2.11 make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.3 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: - supports-color - node-releases@2.0.18: {} + node-int64@0.4.0: {} - nodemon@3.1.7: - dependencies: - chokidar: 3.6.0 - debug: 4.3.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.6.3 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.1 - undefsafe: 2.0.5 + node-mock-http@1.0.3: {} - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 + node-releases@2.0.23: {} + + nodemailer@7.0.9: {} nopt@7.2.1: dependencies: abbrev: 2.0.0 - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: + nopt@8.1.0: dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.15.1 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 + abbrev: 3.0.1 normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.6.3 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -17526,9 +18231,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.6.3 - - npm-normalize-package-bin@1.0.1: {} + semver: 7.7.3 npm-normalize-package-bin@3.0.1: {} @@ -17536,7 +18239,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.6.3 + semver: 7.7.3 validate-npm-package-name: 5.0.1 npm-packlist@8.0.2: @@ -17548,7 +18251,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.3 - semver: 7.6.3 + semver: 7.7.3 npm-registry-fetch@17.1.0: dependencies: @@ -17576,83 +18279,78 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 - nuxi@3.15.0: {} - - nuxt@3.13.0(@parcel/watcher@2.4.1)(@types/node@22.9.0)(encoding@0.1.13)(eslint@9.14.0(jiti@2.4.0))(ioredis@5.4.1)(magicast@0.3.5)(meow@10.1.5)(optionator@0.9.4)(rollup@4.24.4)(sass@1.79.5)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue-tsc@2.1.6(typescript@5.6.3))(webpack-sources@3.2.3)(xml2js@0.6.2): + nuxt@4.1.2(@libsql/client@0.15.15)(@parcel/watcher@2.5.1)(@types/node@24.7.2)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(@libsql/client@0.15.15))(encoding@0.1.13)(eslint@9.37.0(jiti@2.6.1))(ioredis@5.8.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.4)(sass@1.93.2)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1): dependencies: + '@nuxt/cli': 3.29.3(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.6.0(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) - '@nuxt/kit': 3.13.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - '@nuxt/schema': 3.13.0(rollup@4.24.4) - '@nuxt/telemetry': 2.6.0(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - '@nuxt/vite-builder': 3.13.0(@types/node@22.9.0)(eslint@9.14.0(jiti@2.4.0))(magicast@0.3.5)(meow@10.1.5)(optionator@0.9.4)(rollup@4.24.4)(sass@1.79.5)(terser@5.36.0)(typescript@5.6.3)(vue-tsc@2.1.6(typescript@5.6.3))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) - '@unhead/dom': 1.11.11 - '@unhead/ssr': 1.11.11 - '@unhead/vue': 1.11.11(vue@3.5.12(typescript@5.6.3)) - '@vue/shared': 3.5.12 - acorn: 8.12.1 - c12: 1.11.2(magicast@0.3.5) - chokidar: 3.6.0 - compatx: 0.1.8 - consola: 3.2.3 - cookie-es: 1.2.2 + '@nuxt/devtools': 2.6.5(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@nuxt/schema': 4.1.2 + '@nuxt/telemetry': 2.6.6(magicast@0.3.5) + '@nuxt/vite-builder': 4.1.2(@types/node@24.7.2)(eslint@9.37.0(jiti@2.6.1))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.4)(sass@1.93.2)(terser@5.44.0)(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))(yaml@2.8.1) + '@unhead/vue': 2.0.19(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 + c12: 3.3.0(magicast@0.3.5) + chokidar: 4.0.3 + compatx: 0.2.0 + consola: 3.4.2 + cookie-es: 2.0.0 defu: 6.1.4 - destr: 2.0.3 - devalue: 5.1.1 + destr: 2.0.5 + devalue: 5.3.2 errx: 0.1.0 - esbuild: 0.23.1 + esbuild: 0.25.10 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - globby: 14.0.2 - h3: 1.13.0 + exsolve: 1.0.7 + h3: 1.15.4 hookable: 5.5.3 - ignore: 5.3.2 - jiti: 1.21.6 + ignore: 7.0.5 + impound: 1.0.0 + jiti: 2.6.1 klona: 2.0.6 - knitwork: 1.1.0 - magic-string: 0.30.12 - mlly: 1.7.2 - nitropack: 2.10.3(encoding@0.1.13)(typescript@5.6.3)(webpack-sources@3.2.3)(xml2js@0.6.2) - nuxi: 3.15.0 - nypm: 0.3.12 + knitwork: 1.2.0 + magic-string: 0.30.19 + mlly: 1.8.0 + mocked-exports: 0.1.1 + nanotar: 0.2.0 + nitropack: 2.12.7(@libsql/client@0.15.15)(encoding@0.1.13) + nypm: 0.6.2 ofetch: 1.4.1 - ohash: 1.1.4 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.2.1 + ohash: 2.0.11 + on-change: 5.0.1 + oxc-minify: 0.87.0 + oxc-parser: 0.87.0 + oxc-transform: 0.87.0 + oxc-walker: 0.5.2(oxc-parser@0.87.0) + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 radix3: 1.1.2 scule: 1.3.0 - semver: 7.6.3 - std-env: 3.7.0 - strip-literal: 2.1.0 - ufo: 1.5.4 - ultrahtml: 1.5.3 + semver: 7.7.3 + std-env: 3.9.0 + tinyglobby: 0.2.15 + ufo: 1.6.1 + ultrahtml: 1.6.0 uncrypto: 0.1.3 - unctx: 2.3.1(webpack-sources@3.2.3) - unenv: 1.10.0 - unimport: 3.13.1(rollup@4.24.4)(webpack-sources@3.2.3) - unplugin: 1.15.0(webpack-sources@3.2.3) - unplugin-vue-router: 0.10.8(rollup@4.24.4)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3) - unstorage: 1.13.1(ioredis@5.4.1) - untyped: 1.5.1 - vue: 3.5.12(typescript@5.6.3) - vue-bundle-renderer: 2.1.1 + unctx: 2.4.1 + unimport: 5.4.1 + unplugin: 2.3.10 + unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.3)(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)) + unstorage: 1.17.1(db0@0.3.4(@libsql/client@0.15.15))(ioredis@5.8.1) + untyped: 2.0.0 + vue: 3.5.22(typescript@5.9.3) + vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 - vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3)) + vue-router: 4.5.1(vue@3.5.22(typescript@5.9.3)) optionalDependencies: - '@parcel/watcher': 2.4.1 - '@types/node': 22.9.0 + '@parcel/watcher': 2.5.1 + '@types/node': 24.7.2 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -17662,14 +18360,21 @@ snapshots: - '@azure/storage-blob' - '@biomejs/biome' - '@capacitor/preferences' + - '@deno/kv' - '@electric-sql/pglite' - '@libsql/client' - '@netlify/blobs' - '@planetscale/database' - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' + - '@vue/compiler-sfc' + - aws4fetch + - bare-abort-controller - better-sqlite3 - bufferutil + - db0 - drizzle-orm - encoding - eslint @@ -17681,85 +18386,49 @@ snapshots: - meow - mysql2 - optionator + - react-native-b4a + - rolldown - rollup - sass - sass-embedded + - sqlite3 - stylelint - stylus - sugarss - supports-color - terser + - tsx - typescript + - uploadthing - utf-8-validate - vite - vls - vti - vue-tsc - - webpack-sources - xml2js + - yaml - nwsapi@2.2.12: {} - - nypm@0.3.11: - dependencies: - citty: 0.1.6 - consola: 3.2.3 - execa: 8.0.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - ufo: 1.5.4 - - nypm@0.3.12: + nypm@0.6.2: dependencies: citty: 0.1.6 - consola: 3.2.3 - execa: 8.0.1 - pathe: 1.1.2 - pkg-types: 1.2.1 - ufo: 1.5.4 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.1 object-assign@4.1.1: {} - object-hash@2.2.0: {} - - object-inspect@1.13.2: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.getownpropertydescriptors@2.1.8: - dependencies: - array.prototype.reduce: 1.0.7 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - gopd: 1.0.1 - safe-array-concat: 1.1.2 - - ofetch@1.3.4: - dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.4 + object-inspect@1.13.4: {} ofetch@1.4.1: dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.4 + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.1 - ohash@1.1.3: {} + ohash@2.0.11: {} - ohash@1.1.4: {} - - oidc-token-hash@5.0.3: {} + on-change@5.0.1: {} on-exit-leak-free@2.1.2: {} @@ -17767,8 +18436,6 @@ snapshots: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -17785,16 +18452,18 @@ snapshots: dependencies: mimic-function: 5.0.1 - oniguruma-to-js@0.4.3: + oniguruma-to-es@3.1.1: dependencies: - regex: 4.3.3 + emoji-regex-xs: 1.0.0 + regex: 6.0.1 + regex-recursion: 6.0.2 - open@10.1.0: + open@10.2.0: dependencies: default-browser: 5.2.1 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 - is-wsl: 3.1.0 + wsl-utils: 0.1.0 open@8.4.2: dependencies: @@ -17802,37 +18471,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.71.1(encoding@0.1.13): - dependencies: - '@types/node': 18.19.45 - '@types/node-fetch': 2.6.11 - abort-controller: 3.0.0 - agentkeepalive: 4.5.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - openapi-typescript@7.4.2(encoding@0.1.13)(typescript@5.6.3): - dependencies: - '@redocly/openapi-core': 1.25.11(encoding@0.1.13)(supports-color@9.4.0) - ansi-colors: 4.1.3 - change-case: 5.4.4 - parse-json: 8.1.0 - supports-color: 9.4.0 - typescript: 5.6.3 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - encoding - - openid-client@5.7.0: - dependencies: - jose: 4.15.9 - lru-cache: 6.0.0 - object-hash: 2.2.0 - oidc-token-hash: 5.0.3 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -17854,21 +18492,80 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - ora@8.1.1: + ora@9.0.0: dependencies: - chalk: 5.3.0 + chalk: 5.6.2 cli-cursor: 5.0.0 - cli-spinners: 2.9.2 + cli-spinners: 3.3.0 is-interactive: 2.0.0 - is-unicode-supported: 2.0.0 - log-symbols: 6.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.0 + string-width: 8.1.0 + strip-ansi: 7.1.2 orderedmap@2.1.1: {} - os-tmpdir@1.0.2: {} + oxc-minify@0.87.0: + optionalDependencies: + '@oxc-minify/binding-android-arm64': 0.87.0 + '@oxc-minify/binding-darwin-arm64': 0.87.0 + '@oxc-minify/binding-darwin-x64': 0.87.0 + '@oxc-minify/binding-freebsd-x64': 0.87.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.87.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.87.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.87.0 + '@oxc-minify/binding-linux-arm64-musl': 0.87.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.87.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.87.0 + '@oxc-minify/binding-linux-x64-gnu': 0.87.0 + '@oxc-minify/binding-linux-x64-musl': 0.87.0 + '@oxc-minify/binding-wasm32-wasi': 0.87.0 + '@oxc-minify/binding-win32-arm64-msvc': 0.87.0 + '@oxc-minify/binding-win32-x64-msvc': 0.87.0 + + oxc-parser@0.87.0: + dependencies: + '@oxc-project/types': 0.87.0 + optionalDependencies: + '@oxc-parser/binding-android-arm64': 0.87.0 + '@oxc-parser/binding-darwin-arm64': 0.87.0 + '@oxc-parser/binding-darwin-x64': 0.87.0 + '@oxc-parser/binding-freebsd-x64': 0.87.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.87.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.87.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.87.0 + '@oxc-parser/binding-linux-arm64-musl': 0.87.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.87.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.87.0 + '@oxc-parser/binding-linux-x64-gnu': 0.87.0 + '@oxc-parser/binding-linux-x64-musl': 0.87.0 + '@oxc-parser/binding-wasm32-wasi': 0.87.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.87.0 + '@oxc-parser/binding-win32-x64-msvc': 0.87.0 + + oxc-transform@0.87.0: + optionalDependencies: + '@oxc-transform/binding-android-arm64': 0.87.0 + '@oxc-transform/binding-darwin-arm64': 0.87.0 + '@oxc-transform/binding-darwin-x64': 0.87.0 + '@oxc-transform/binding-freebsd-x64': 0.87.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.87.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.87.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.87.0 + '@oxc-transform/binding-linux-arm64-musl': 0.87.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.87.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.87.0 + '@oxc-transform/binding-linux-x64-gnu': 0.87.0 + '@oxc-transform/binding-linux-x64-musl': 0.87.0 + '@oxc-transform/binding-wasm32-wasi': 0.87.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.87.0 + '@oxc-transform/binding-win32-x64-msvc': 0.87.0 + + oxc-walker@0.5.2(oxc-parser@0.87.0): + dependencies: + magic-regexp: 0.10.0 + oxc-parser: 0.87.0 p-cancelable@2.1.1: {} @@ -17882,7 +18579,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.1.1 + yocto-queue: 1.2.1 p-locate@4.1.0: dependencies: @@ -17900,25 +18597,43 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-map@5.5.0: + p-min-delay@4.2.0: + dependencies: + yoctodelay: 2.0.0 + + p-try@2.2.0: {} + + pac-proxy-agent@7.2.0: dependencies: - aggregate-error: 4.0.1 + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color - p-min-delay@4.0.2: + pac-resolver@7.0.1: dependencies: - yoctodelay: 1.2.0 + degenerator: 5.0.1 + netmask: 2.0.2 - p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} - package-json-from-dist@1.0.0: {} + package-manager-detector@1.4.0: {} - package-manager-detector@0.2.2: {} + package-up@5.0.0: + dependencies: + find-up-simple: 1.0.1 pacote@18.0.6: dependencies: '@npmcli/git': 5.0.8 '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/package-json': 5.2.0 + '@npmcli/package-json': 5.2.1 '@npmcli/promise-spawn': 7.0.2 '@npmcli/run-script': 8.1.0 cacache: 18.0.4 @@ -17937,78 +18652,47 @@ snapshots: - bluebird - supports-color - pako@1.0.11: {} - pako@2.1.0: {} - param-case@2.1.1: - dependencies: - no-case: 2.3.2 - parent-module@1.0.1: dependencies: callsites: 3.1.0 + parent-require@1.0.0: {} + parse-conflict-json@3.0.1: dependencies: json-parse-even-better-errors: 3.0.2 just-diff: 6.0.2 just-diff-apply: 5.5.0 - parse-git-config@3.0.0: - dependencies: - git-config-path: 2.0.0 - ini: 1.3.8 - - parse-imports@2.1.1: + parse-imports-exports@0.2.4: dependencies: - es-module-lexer: 1.5.4 - slashes: 3.0.12 + parse-statements: 1.0.11 parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@7.1.1: - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.2 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 - - parse-json@8.1.0: - dependencies: - '@babel/code-frame': 7.26.2 - index-to-position: 0.1.2 - type-fest: 4.25.0 - parse-ms@4.0.0: {} - parse-path@7.0.0: - dependencies: - protocols: 2.0.1 - - parse-url@8.1.0: + parse-path@7.1.0: dependencies: - parse-path: 7.0.0 + protocols: 2.0.2 - parse5-htmlparser2-tree-adapter@7.0.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 + parse-statements@1.0.11: {} - parse5@7.1.2: + parse-url@9.2.0: dependencies: - entities: 4.5.0 + '@types/parse-path': 7.1.0 + parse-path: 7.1.0 - parseley@0.12.1: + parse5@7.3.0: dependencies: - leac: 0.6.0 - peberminta: 0.9.0 + entities: 6.0.1 parseurl@1.3.3: {} @@ -18023,14 +18707,13 @@ snapshots: passport-strategy@1.0.0: {} - passport@0.6.0: + passport@0.7.0: dependencies: passport-strategy: 1.0.0 pause: 0.0.1 utils-merge: 1.0.1 - path-browserify@1.0.1: - optional: true + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -18049,45 +18732,47 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + path-to-regexp@6.3.0: {} - path-to-regexp@8.1.0: {} + path-to-regexp@8.2.0: {} + + path-to-regexp@8.3.0: {} path-type@4.0.0: {} - path-type@5.0.0: {} + path-type@6.0.0: {} pathe@1.1.2: {} - pause@0.0.1: {} + pathe@2.0.3: {} - peberminta@0.9.0: {} + pause@0.0.1: {} pend@1.2.0: {} perfect-debounce@1.0.0: {} - pg-cloudflare@1.1.1: + perfect-debounce@2.0.0: {} + + pg-cloudflare@1.2.7: optional: true - pg-connection-string@2.7.0: {} + pg-connection-string@2.6.2: {} - pg-cursor@2.12.1(pg@8.13.1): - dependencies: - pg: 8.13.1 + pg-connection-string@2.9.1: {} pg-int8@1.0.1: {} - pg-pool@3.7.0(pg@8.13.1): + pg-pool@3.10.1(pg@8.16.3): dependencies: - pg: 8.13.1 - - pg-protocol@1.7.0: {} + pg: 8.16.3 - pg-query-stream@4.7.1(pg@8.13.1): - dependencies: - pg: 8.13.1 - pg-cursor: 2.12.1(pg@8.13.1) + pg-protocol@1.10.3: {} pg-types@2.2.0: dependencies: @@ -18097,23 +18782,21 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.13.1: + pg@8.16.3: dependencies: - pg-connection-string: 2.7.0 - pg-pool: 3.7.0(pg@8.13.1) - pg-protocol: 1.7.0 + pg-connection-string: 2.9.1 + pg-pool: 3.10.1(pg@8.16.3) + pg-protocol: 1.10.3 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.1.1 + pg-cloudflare: 1.2.7 pgpass@1.0.5: dependencies: split2: 4.2.0 - picocolors@1.0.1: {} - - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -18121,30 +18804,35 @@ snapshots: picomatch@4.0.2: {} - pid-port@1.0.0: + picomatch@4.0.3: {} + + pid-port@1.0.2: dependencies: execa: 8.0.1 - pinia@2.2.6(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)): + pid-port@2.0.0: dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.12(typescript@5.6.3) - vue-demi: 0.14.10(vue@3.5.12(typescript@5.6.3)) + execa: 9.6.0 + + pinia@3.0.3(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 7.7.7 + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 - pino-http@10.3.0: + pino-http@10.5.0: dependencies: get-caller-file: 2.0.5 - pino: 9.5.0 + pino: 9.13.1 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 5.0.0 - pino-pretty@12.0.0: + pino-pretty@13.1.2: dependencies: colorette: 2.0.20 dateformat: 4.6.3 @@ -18155,53 +18843,58 @@ snapshots: minimist: 1.2.8 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pump: 3.0.0 - readable-stream: 4.5.2 - secure-json-parse: 2.7.0 + pump: 3.0.3 + secure-json-parse: 4.1.0 sonic-boom: 4.2.0 - strip-json-comments: 3.1.1 + strip-json-comments: 5.0.3 pino-std-serializers@7.0.0: {} - pino@9.5.0: + pino@9.13.1: dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 + slow-redact: 0.3.2 sonic-boom: 4.2.0 thread-stream: 3.1.0 + pirates@4.0.7: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 - pkg-dir@8.0.0: + pkg-dir@9.0.0: dependencies: - find-up-simple: 1.0.0 + find-up-simple: 1.0.1 - pkg-types@1.2.0: + pkg-types@1.3.1: dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 - pkg-types@1.2.1: + pkg-types@2.3.0: dependencies: - confbox: 0.1.8 - mlly: 1.7.2 - pathe: 1.1.2 + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 - playwright-core@1.46.1: {} + playwright-core@1.56.0: {} - playwright@1.46.1: + playwright@1.56.0: dependencies: - playwright-core: 1.46.1 + playwright-core: 1.56.0 optionalDependencies: fsevents: 2.3.2 @@ -18209,144 +18902,142 @@ snapshots: pony-cause@2.1.11: {} - possible-typed-array-names@1.0.0: {} - - postcss-calc@10.0.2(postcss@8.4.47): + postcss-calc@10.1.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-colormin@7.0.2(postcss@8.4.47): + postcss-colormin@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.24.2 + browserslist: 4.26.3 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.4(postcss@8.4.47): + postcss-convert-values@7.0.7(postcss@8.5.6): dependencies: - browserslist: 4.24.2 - postcss: 8.4.47 + browserslist: 4.26.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-discard-comments@7.0.3(postcss@8.4.47): + postcss-discard-comments@7.0.4(postcss@8.5.6): dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 - postcss-discard-duplicates@7.0.1(postcss@8.4.47): + postcss-discard-duplicates@7.0.2(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 - postcss-discard-empty@7.0.0(postcss@8.4.47): + postcss-discard-empty@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 - postcss-discard-overridden@7.0.0(postcss@8.4.47): + postcss-discard-overridden@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 - postcss-merge-longhand@7.0.4(postcss@8.4.47): + postcss-merge-longhand@7.0.5(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - stylehacks: 7.0.4(postcss@8.4.47) + stylehacks: 7.0.6(postcss@8.5.6) - postcss-merge-rules@7.0.4(postcss@8.4.47): + postcss-merge-rules@7.0.6(postcss@8.5.6): dependencies: - browserslist: 4.24.2 + browserslist: 4.26.3 caniuse-api: 3.0.0 - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 - postcss-minify-font-values@7.0.0(postcss@8.4.47): + postcss-minify-font-values@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-gradients@7.0.0(postcss@8.4.47): + postcss-minify-gradients@7.0.1(postcss@8.5.6): dependencies: colord: 2.9.3 - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-params@7.0.2(postcss@8.4.47): + postcss-minify-params@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.24.2 - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 + browserslist: 4.26.3 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-selectors@7.0.4(postcss@8.4.47): + postcss-minify-selectors@7.0.5(postcss@8.5.6): dependencies: cssesc: 3.0.0 - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 - postcss-normalize-charset@7.0.0(postcss@8.4.47): + postcss-normalize-charset@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 - postcss-normalize-display-values@7.0.0(postcss@8.4.47): + postcss-normalize-display-values@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-positions@7.0.0(postcss@8.4.47): + postcss-normalize-positions@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@7.0.0(postcss@8.4.47): + postcss-normalize-repeat-style@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-string@7.0.0(postcss@8.4.47): + postcss-normalize-string@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@7.0.0(postcss@8.4.47): + postcss-normalize-timing-functions@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@7.0.2(postcss@8.4.47): + postcss-normalize-unicode@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.24.2 - postcss: 8.4.47 + browserslist: 4.26.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-url@7.0.0(postcss@8.4.47): + postcss-normalize-url@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@7.0.0(postcss@8.4.47): + postcss-normalize-whitespace@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-ordered-values@7.0.1(postcss@8.4.47): + postcss-ordered-values@7.0.2(postcss@8.5.6): dependencies: - cssnano-utils: 5.0.0(postcss@8.4.47) - postcss: 8.4.47 + cssnano-utils: 5.0.1(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-reduce-initial@7.0.2(postcss@8.4.47): + postcss-reduce-initial@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.24.2 + browserslist: 4.26.3 caniuse-api: 3.0.0 - postcss: 8.4.47 + postcss: 8.5.6 - postcss-reduce-transforms@7.0.0(postcss@8.4.47): + postcss-reduce-transforms@7.0.1(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-selector-parser@6.1.2: @@ -18354,42 +19045,61 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@7.0.1(postcss@8.4.47): + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@7.1.0(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - svgo: 3.3.2 + svgo: 4.0.0 - postcss-unique-selectors@7.0.3(postcss@8.4.47): + postcss-unique-selectors@7.0.4(postcss@8.5.6): dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 postcss-value-parser@4.2.0: {} - postcss@8.4.47: + postcss@8.5.6: dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 + nanoid: 3.3.11 + picocolors: 1.1.1 source-map-js: 1.2.1 postgres-array@2.0.0: {} + postgres-array@3.0.4: {} + postgres-bytea@1.0.0: {} postgres-date@1.0.7: {} + postgres-date@2.1.0: {} + postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - preact@10.23.2: {} + postgres-interval@4.0.2: {} + + preact@10.27.2: {} prelude-ls@1.2.1: {} - pretty-bytes@6.1.1: {} + prettier@3.6.2: {} + + pretty-bytes@7.1.0: {} + + pretty-format@30.2.0: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 - pretty-ms@9.1.0: + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -18401,7 +19111,7 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@4.0.0: {} + process-warning@5.0.0: {} process@0.11.10: {} @@ -18409,10 +19119,12 @@ snapshots: promise-all-reject-late@1.0.1: {} - promise-call-limit@3.0.1: {} + promise-call-limit@3.0.2: {} promise-inflight@1.0.1: {} + promise-limit@2.7.0: {} + promise-queue@2.2.5: {} promise-retry@2.0.1: @@ -18427,114 +19139,112 @@ snapshots: property-expr@2.0.6: {} - property-information@6.5.0: {} + property-information@7.1.0: {} - prosemirror-changeset@2.2.1: + prosemirror-changeset@2.3.1: dependencies: - prosemirror-transform: 1.10.2 + prosemirror-transform: 1.10.4 prosemirror-collab@1.3.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-commands@1.6.2: + prosemirror-commands@1.7.1: dependencies: - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 + prosemirror-transform: 1.10.4 - prosemirror-dropcursor@1.8.1: + prosemirror-dropcursor@1.8.2: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 - prosemirror-view: 1.36.0 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 prosemirror-gapcursor@1.3.2: dependencies: - prosemirror-keymap: 1.2.2 - prosemirror-model: 1.23.0 + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.36.0 + prosemirror-view: 1.41.3 prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 - prosemirror-view: 1.36.0 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 rope-sequence: 1.3.4 - prosemirror-inputrules@1.4.0: + prosemirror-inputrules@1.5.0: dependencies: prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 + prosemirror-transform: 1.10.4 - prosemirror-keymap@1.2.2: + prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.3 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.1: + prosemirror-markdown@1.13.2: dependencies: '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 - prosemirror-menu@1.2.4: + prosemirror-menu@1.2.5: dependencies: crelt: 1.0.6 - prosemirror-commands: 1.6.2 + prosemirror-commands: 1.7.1 prosemirror-history: 1.4.1 prosemirror-state: 1.4.3 - prosemirror-model@1.23.0: + prosemirror-model@1.25.3: dependencies: orderedmap: 2.1.1 - prosemirror-schema-basic@1.2.3: + prosemirror-schema-basic@1.2.4: dependencies: - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 - prosemirror-schema-list@1.4.1: + prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 + prosemirror-transform: 1.10.4 prosemirror-state@1.4.3: dependencies: - prosemirror-model: 1.23.0 - prosemirror-transform: 1.10.2 - prosemirror-view: 1.36.0 + prosemirror-model: 1.25.3 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 - prosemirror-tables@1.6.1: + prosemirror-tables@1.8.1: dependencies: - prosemirror-keymap: 1.2.2 - prosemirror-model: 1.23.0 + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 - prosemirror-view: 1.36.0 + prosemirror-transform: 1.10.4 + prosemirror-view: 1.41.3 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.23.0)(prosemirror-state@1.4.3)(prosemirror-view@1.36.0): + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3): dependencies: '@remirror/core-constants': 3.0.0 escape-string-regexp: 4.0.0 - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 prosemirror-state: 1.4.3 - prosemirror-view: 1.36.0 + prosemirror-view: 1.41.3 - prosemirror-transform@1.10.2: + prosemirror-transform@1.10.4: dependencies: - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 - prosemirror-view@1.36.0: + prosemirror-view@1.41.3: dependencies: - prosemirror-model: 1.23.0 + prosemirror-model: 1.25.3 prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.2 + prosemirror-transform: 1.10.4 - proto-list@1.2.4: {} - - protobufjs@7.4.0: + protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -18546,10 +19256,10 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.9.0 - long: 5.2.3 + '@types/node': 24.7.2 + long: 5.3.2 - protocols@2.0.1: {} + protocols@2.0.2: {} proxy-addr@2.0.7: dependencies: @@ -18560,33 +19270,27 @@ snapshots: ps-list@8.1.1: {} - psl@1.9.0: {} - - pstree.remy@1.1.8: {} - - pump@3.0.0: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode.js@2.3.1: {} - punycode@1.3.2: {} - punycode@2.3.1: {} - qs@6.13.0: + pure-rand@7.0.1: {} + + qs@6.14.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 - querystring@0.2.0: {} + quansync@0.2.11: {} querystringify@2.2.0: {} queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -18597,38 +19301,25 @@ snapshots: radix3@1.1.2: {} - random-bytes@1.0.0: {} - - randombytes@2.0.3: {} - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - randomstring@1.3.0: - dependencies: - randombytes: 2.0.3 - range-parser@1.2.1: {} - raw-body@2.5.2: + raw-body@3.0.1: dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 + iconv-lite: 0.7.0 unpipe: 1.0.0 rc9@2.1.2: dependencies: defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 + + react-is@18.3.1: {} read-cmd-shim@4.0.0: {} @@ -18637,58 +19328,6 @@ snapshots: json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 - read-package-json@2.1.2: - dependencies: - glob: 7.2.3 - json-parse-even-better-errors: 2.3.1 - normalize-package-data: 2.5.0 - npm-normalize-package-bin: 1.0.1 - - read-package-tree@5.3.1: - dependencies: - read-package-json: 2.1.2 - readdir-scoped-modules: 1.1.0 - util-promisify: 2.1.0 - - read-pkg-up@10.1.0: - dependencies: - find-up: 6.3.0 - read-pkg: 8.1.0 - type-fest: 4.25.0 - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg-up@8.0.0: - dependencies: - find-up: 5.0.0 - read-pkg: 6.0.0 - type-fest: 1.4.0 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - read-pkg@6.0.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 1.4.0 - - read-pkg@8.1.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 7.1.1 - type-fest: 4.25.0 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -18705,7 +19344,7 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.2: + readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -18717,29 +19356,13 @@ snapshots: dependencies: minimatch: 5.1.6 - readdir-scoped-modules@1.1.0: - dependencies: - debuglog: 1.0.1 - dezalgo: 1.0.4 - graceful-fs: 4.2.11 - once: 1.4.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readdirp@4.0.2: {} + readdirp@4.1.2: {} real-require@0.2.0: {} - rechoir@0.6.2: - dependencies: - resolve: 1.22.8 - - redent@4.0.0: + rechoir@0.8.0: dependencies: - indent-string: 5.0.0 - strip-indent: 4.0.0 + resolve: 1.22.10 redis-errors@1.2.0: {} @@ -18751,9 +19374,17 @@ snapshots: dependencies: '@eslint-community/regexpp': 4.12.1 - regenerator-runtime@0.14.1: {} + reflect-metadata@0.2.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} - regex@4.3.3: {} + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 regexp-ast-analysis@0.7.1: dependencies: @@ -18762,46 +19393,39 @@ snapshots: regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - regjsparser@0.10.0: + regjsparser@0.12.0: dependencies: - jsesc: 0.5.0 - - relateurl@0.2.7: {} + jsesc: 3.0.2 require-directory@2.1.1: {} require-from-string@2.0.2: {} - require-in-the-middle@7.4.0: + require-in-the-middle@7.5.2: dependencies: - debug: 4.3.7(supports-color@9.4.0) - module-details-from-path: 1.0.3 - resolve: 1.22.8 + debug: 4.4.3 + module-details-from-path: 1.0.4 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - require-main-filename@2.0.0: {} - requires-port@1.0.0: {} resolve-alpn@1.2.1: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -18819,11 +19443,9 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry-as-promised@7.0.4: {} - retry@0.12.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -18831,58 +19453,60 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-visualizer@5.12.0(rollup@4.24.4): + rollup-plugin-visualizer@6.0.4(rollup@4.52.4): dependencies: open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.4 + picomatch: 4.0.3 + source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 4.24.4 + rollup: 4.52.4 - rollup@4.24.4: + rollup@4.52.4: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.4 - '@rollup/rollup-android-arm64': 4.24.4 - '@rollup/rollup-darwin-arm64': 4.24.4 - '@rollup/rollup-darwin-x64': 4.24.4 - '@rollup/rollup-freebsd-arm64': 4.24.4 - '@rollup/rollup-freebsd-x64': 4.24.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.4 - '@rollup/rollup-linux-arm-musleabihf': 4.24.4 - '@rollup/rollup-linux-arm64-gnu': 4.24.4 - '@rollup/rollup-linux-arm64-musl': 4.24.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.4 - '@rollup/rollup-linux-riscv64-gnu': 4.24.4 - '@rollup/rollup-linux-s390x-gnu': 4.24.4 - '@rollup/rollup-linux-x64-gnu': 4.24.4 - '@rollup/rollup-linux-x64-musl': 4.24.4 - '@rollup/rollup-win32-arm64-msvc': 4.24.4 - '@rollup/rollup-win32-ia32-msvc': 4.24.4 - '@rollup/rollup-win32-x64-msvc': 4.24.4 + '@rollup/rollup-android-arm-eabi': 4.52.4 + '@rollup/rollup-android-arm64': 4.52.4 + '@rollup/rollup-darwin-arm64': 4.52.4 + '@rollup/rollup-darwin-x64': 4.52.4 + '@rollup/rollup-freebsd-arm64': 4.52.4 + '@rollup/rollup-freebsd-x64': 4.52.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 + '@rollup/rollup-linux-arm-musleabihf': 4.52.4 + '@rollup/rollup-linux-arm64-gnu': 4.52.4 + '@rollup/rollup-linux-arm64-musl': 4.52.4 + '@rollup/rollup-linux-loong64-gnu': 4.52.4 + '@rollup/rollup-linux-ppc64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-gnu': 4.52.4 + '@rollup/rollup-linux-riscv64-musl': 4.52.4 + '@rollup/rollup-linux-s390x-gnu': 4.52.4 + '@rollup/rollup-linux-x64-gnu': 4.52.4 + '@rollup/rollup-linux-x64-musl': 4.52.4 + '@rollup/rollup-openharmony-arm64': 4.52.4 + '@rollup/rollup-win32-arm64-msvc': 4.52.4 + '@rollup/rollup-win32-ia32-msvc': 4.52.4 + '@rollup/rollup-win32-x64-gnu': 4.52.4 + '@rollup/rollup-win32-x64-msvc': 4.52.4 fsevents: 2.3.3 rope-sequence@1.3.4: {} - router@2.0.0: + router@2.2.0: dependencies: - array-flatten: 3.0.0 + debug: 4.4.3 + depd: 2.0.0 is-promise: 4.0.0 - methods: 1.1.2 parseurl: 1.3.3 - path-to-regexp: 8.1.0 - setprototypeof: 1.2.0 - utils-merge: 1.0.1 - - rrweb-cssom@0.6.0: {} + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color - rrweb-cssom@0.7.1: {} + rrweb-cssom@0.8.0: {} - run-applescript@7.0.0: {} + run-applescript@7.1.0: {} - run-async@3.0.0: {} + run-async@4.0.6: {} run-parallel@1.2.0: dependencies: @@ -18890,44 +19514,47 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - safe-array-concat@1.1.2: + rxjs@7.8.2: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 + tslib: 2.8.1 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - safe-require@1.0.4: {} - safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} - sass@1.79.5: + sass@1.93.2: dependencies: - '@parcel/watcher': 2.4.1 - chokidar: 4.0.1 - immutable: 4.3.7 - source-map-js: 1.2.0 + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 - sax@1.2.1: {} + sax@1.4.1: {} saxes@6.0.0: dependencies: xmlchars: 2.2.0 + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.1 @@ -18936,13 +19563,9 @@ snapshots: scule@1.3.0: {} - search-insights@2.17.0: {} - - secure-json-parse@2.7.0: {} + search-insights@2.17.3: {} - selderee@0.11.0: - dependencies: - parseley: 0.12.1 + secure-json-parse@4.1.0: {} semver@5.7.2: {} @@ -18952,77 +19575,21 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.6.3: {} - - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color + semver@7.7.3: {} - send@1.1.0: + send@1.2.0: dependencies: - debug: 4.3.7(supports-color@9.4.0) - destroy: 1.2.0 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - fresh: 0.5.2 + fresh: 2.0.0 http-errors: 2.0.0 - mime-types: 2.1.35 + mime-types: 3.0.1 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - sequelize-cli@6.6.2: - dependencies: - cli-color: 2.0.4 - fs-extra: 9.1.0 - js-beautify: 1.15.1 - lodash: 4.17.21 - resolve: 1.22.8 - umzug: 2.3.0 - yargs: 16.2.0 - - sequelize-pool@7.1.0: {} - - sequelize-replace-enum-postgres@1.6.0: {} - - sequelize@6.37.5(pg@8.13.1): - dependencies: - '@types/debug': 4.1.12 - '@types/validator': 13.12.1 - debug: 4.3.7(supports-color@9.4.0) - dottie: 2.0.6 - inflection: 1.13.4 - lodash: 4.17.21 - moment: 2.30.1 - moment-timezone: 0.5.45 - pg-connection-string: 2.7.0 - retry-as-promised: 7.0.4 - semver: 7.6.3 - sequelize-pool: 7.1.0 - toposort-class: 1.0.1 - uuid: 8.3.2 - validator: 13.12.0 - wkx: 0.5.0 - optionalDependencies: - pg: 8.13.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -19034,43 +19601,16 @@ snapshots: dependencies: defu: 6.1.4 - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - serve-static@2.1.0: + serve-static@2.2.0: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.1.0 + send: 1.2.0 transitivePeerDependencies: - supports-color - set-blocking@2.0.0: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - setimmediate@1.0.5: {} + set-cookie-parser@2.7.1: {} setprototypeof@1.2.0: {} @@ -19080,31 +19620,53 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.3: {} - shelljs@0.8.5: + shelljs@0.10.0: dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 + execa: 5.1.1 + fast-glob: 3.3.3 - shiki@1.22.2: + shiki@2.5.0: dependencies: - '@shikijs/core': 1.22.2 - '@shikijs/engine-javascript': 1.22.2 - '@shikijs/engine-oniguruma': 1.22.2 - '@shikijs/types': 1.22.2 - '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 shimmer@1.2.1: {} - side-channel@1.0.6: + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 signal-exit@3.0.7: {} @@ -19114,91 +19676,65 @@ snapshots: dependencies: '@sigstore/bundle': 2.3.2 '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 + '@sigstore/protobuf-specs': 0.3.3 '@sigstore/sign': 2.3.2 '@sigstore/tuf': 2.3.4 '@sigstore/verify': 1.2.1 transitivePeerDependencies: - supports-color - simple-git@3.25.0: - dependencies: - '@kwsites/file-exists': 1.1.1 - '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.7(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color - - simple-git@3.27.0: + simple-git@3.28.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.7(supports-color@9.4.0) - transitivePeerDependencies: - - supports-color - - simple-oauth2@5.1.0: - dependencies: - '@hapi/hoek': 11.0.4 - '@hapi/wreck': 18.1.0 - debug: 4.3.6 - joi: 17.13.3 + debug: 4.4.3 transitivePeerDependencies: - supports-color - simple-update-notifier@2.0.0: + sirv@3.0.2: dependencies: - semver: 7.6.3 - - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.25 - mrmime: 2.0.0 + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 totalist: 3.0.1 sisteransi@1.0.5: {} slash@3.0.0: {} - slash@4.0.0: {} - slash@5.1.0: {} - slashes@3.0.12: {} - - slick@1.12.2: {} + slow-redact@0.3.2: {} smart-buffer@4.2.0: {} smob@1.5.0: {} - socks-proxy-agent@8.0.4: + socks-proxy-agent@8.0.5: dependencies: - agent-base: 7.1.1(supports-color@9.4.0) - debug: 4.3.7(supports-color@9.4.0) - socks: 2.8.3 + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.8.3: + socks@2.8.7: dependencies: - ip-address: 9.0.5 + ip-address: 10.0.1 smart-buffer: 4.2.0 sonic-boom@4.2.0: dependencies: atomic-sleep: 1.0.0 - sort-keys@5.0.0: - dependencies: - is-plain-obj: 4.1.0 - sortablejs@1.14.0: {} - source-map-js@1.2.0: {} - source-map-js@1.2.1: {} + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -19208,26 +19744,28 @@ snapshots: source-map@0.7.4: {} + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.22 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.22 spdx-expression-parse@4.0.0: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.20: {} + spdx-license-ids@3.0.22: {} speakingurl@14.0.1: {} @@ -19235,41 +19773,50 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} + sqlstring-sqlite@0.1.1: {} + + sqlstring@2.3.3: {} + + srvx@0.8.16: {} ssri@10.0.6: dependencies: minipass: 7.1.2 - stable-hash@0.0.4: {} + stable-hash-x@0.2.0: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 standard-as-callback@2.1.0: {} statuses@2.0.1: {} - std-env@3.7.0: {} - - stdin-discarder@0.2.2: {} + statuses@2.0.2: {} - stream-browserify@3.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 + std-env@3.9.0: {} - stream-shift@1.0.3: {} + stdin-discarder@0.2.2: {} streamsearch@1.1.0: {} - streamx@2.19.0: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.1.1 - optionalDependencies: - bare-events: 2.4.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a string-argv@0.3.2: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -19280,32 +19827,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 - string.prototype.trimstart@1.0.8: + string-width@8.1.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 string_decoder@1.1.1: dependencies: @@ -19324,9 +19857,13 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} strip-final-newline@2.0.0: {} @@ -19334,35 +19871,56 @@ snapshots: strip-final-newline@4.0.0: {} - strip-indent@3.0.0: + strip-indent@4.1.1: {} + + strip-json-comments@3.1.1: {} + + strip-json-comments@5.0.3: {} + + strip-literal@3.1.0: dependencies: - min-indent: 1.0.1 + js-tokens: 9.0.1 - strip-indent@4.0.0: + strnum@2.1.1: {} + + strtok3@10.3.4: dependencies: - min-indent: 1.0.1 + '@tokenizer/token': 0.3.0 - strip-json-comments@3.1.1: {} + structured-clone-es@1.0.0: {} - strip-literal@2.1.0: + stylehacks@7.0.6(postcss@8.5.6): dependencies: - js-tokens: 9.0.0 + browserslist: 4.26.3 + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 - strnum@1.0.5: {} - - stylehacks@7.0.4(postcss@8.4.47): + superagent@10.2.3: dependencies: - browserslist: 4.24.2 - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3 + fast-safe-stringify: 2.1.1 + form-data: 4.0.4 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.14.0 + transitivePeerDependencies: + - supports-color - superjson@2.2.1: + superjson@2.2.2: dependencies: copy-anything: 3.0.5 - supports-color@5.5.0: + supertest@7.1.4: dependencies: - has-flag: 3.0.0 + methods: 1.1.2 + superagent: 10.2.3 + transitivePeerDependencies: + - supports-color + + supports-color@10.2.2: {} supports-color@7.2.0: dependencies: @@ -19372,40 +19930,57 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@9.4.0: {} - supports-preserve-symlinks-flag@1.0.0: {} - svg-tags@1.0.0: {} - - svgo@3.3.2: + svgo@4.0.0: dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 5.1.0 - css-tree: 2.3.1 - css-what: 6.1.0 + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.1.0 + css-what: 6.2.2 csso: 5.0.5 - picocolors: 1.1.0 + picocolors: 1.1.1 + sax: 1.4.1 + + swagger-ui-dist@5.21.0: + dependencies: + '@scarf/scarf': 1.4.0 + + swagger-ui-dist@5.29.4: + dependencies: + '@scarf/scarf': 1.4.0 + + swagger-ui-express@5.0.1(express@5.1.0): + dependencies: + express: 5.1.0 + swagger-ui-dist: 5.29.4 + + symbol-observable@4.0.0: {} symbol-tree@3.2.4: {} - synckit@0.9.1: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.7.0 + '@pkgr/core': 0.2.9 system-architecture@0.1.0: {} + systeminformation@5.27.11: {} + tabbable@6.2.0: {} - tapable@2.2.1: {} + tagged-tag@1.0.0: {} + + tapable@2.3.0: {} tar-stream@3.1.7: dependencies: - b4a: 1.6.6 + b4a: 1.7.3 fast-fifo: 1.3.2 - streamx: 2.19.0 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a tar@6.2.1: dependencies: @@ -19416,42 +19991,64 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + tarn@3.0.2: {} + taskkill@5.0.0: dependencies: execa: 6.1.0 - terser@5.36.0: + terser-webpack-plugin@5.3.14(webpack@5.100.2): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.0 + webpack: 5.100.2 + + terser@5.44.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 - text-decoder@1.1.1: + test-exclude@6.0.0: dependencies: - b4a: 1.6.6 + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 - text-table@0.2.0: {} + text-decoder@1.2.3: + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a thread-stream@3.1.0: dependencies: real-require: 0.2.0 - through@2.3.8: {} - - timers-ext@0.1.8: - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 + tildify@2.0.0: {} tiny-case@1.0.3: {} tiny-invariant@1.3.3: {} - tinyglobby@0.2.10: + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: dependencies: - fdir: 6.4.2(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tippy.js@6.3.7: dependencies: @@ -19459,13 +20056,15 @@ snapshots: title-case-minors@1.0.0: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 + tldts-core@7.0.17: {} - tmp@0.2.1: + tldts@7.0.17: dependencies: - rimraf: 3.0.2 + tldts-core: 7.0.17 + + tmp@0.2.5: {} + + tmpl@1.0.5: {} to-camel-case@1.0.0: dependencies: @@ -19497,8 +20096,6 @@ snapshots: dependencies: to-space-case: 1.0.0 - to-fast-properties@2.0.0: {} - to-no-case@1.0.2: {} to-pascal-case@1.0.0: @@ -19534,24 +20131,23 @@ snapshots: toidentifier@1.0.1: {} - toposort-class@1.0.1: {} + token-types@6.1.1: + dependencies: + '@borewit/text-codec': 0.1.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 toposort@2.0.2: {} totalist@3.0.1: {} - touch@3.1.1: {} - - tough-cookie@4.1.4: + tough-cookie@6.0.0: dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + tldts: 7.0.17 tr46@0.0.3: {} - tr46@5.0.0: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -19561,18 +20157,82 @@ snapshots: trim-lines@3.0.1: {} - trim-newlines@4.1.1: {} + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-jest@29.4.5(@babel/core@7.28.4)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.4))(jest-util@30.2.0)(jest@30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)))(typescript@5.9.3): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + handlebars: 4.7.8 + jest: 30.2.0(@types/node@24.7.2)(ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3)) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.3 + type-fest: 4.41.0 + typescript: 5.9.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.28.4 + '@jest/transform': 30.2.0 + '@jest/types': 30.2.0 + babel-jest: 30.2.0(@babel/core@7.28.4) + jest-util: 30.2.0 + + ts-loader@9.5.4(typescript@5.9.3)(webpack@5.100.2): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.3 + micromatch: 4.0.8 + semver: 7.7.3 + source-map: 0.7.6 + typescript: 5.9.3 + webpack: 5.100.2 + + ts-morph@27.0.2: + dependencies: + '@ts-morph/common': 0.28.1 + code-block-writer: 13.0.3 + + ts-node@10.9.2(@types/node@24.7.2)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 24.7.2 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 - ts-api-utils@1.3.0(typescript@5.6.3): + tsconfig-paths-webpack-plugin@4.2.0: dependencies: - typescript: 5.6.3 + chalk: 4.1.2 + enhanced-resolve: 5.18.3 + tapable: 2.3.0 + 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.7.0: {} + tslib@2.8.1: {} tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.3 make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -19581,176 +20241,105 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} + type-detect@4.0.8: {} type-fest@0.21.3: {} - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - - type-fest@1.4.0: {} - type-fest@2.19.0: {} - type-fest@3.13.1: {} + type-fest@4.41.0: {} - type-fest@4.25.0: {} + type-fest@5.1.0: + dependencies: + tagged-tag: 1.0.0 type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - type-is@2.0.0: + type-is@2.0.1: dependencies: content-type: 1.0.5 media-typer: 1.1.0 - mime-types: 3.0.0 - - type@2.7.3: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + mime-types: 3.0.1 - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + type-level-regexp@0.1.17: {} typedarray@0.0.6: {} - typescript@5.6.3: {} + typescript@5.8.3: {} + + typescript@5.9.3: {} uc.micro@2.1.0: {} - ufo@1.5.4: {} + ufo@1.6.1: {} - uglify-js@3.19.2: {} + uglify-js@3.19.3: + optional: true - uid-safe@2.1.5: + uid@2.0.2: dependencies: - random-bytes: 1.0.0 + '@lukeed/csprng': 1.1.0 - ultrahtml@1.5.3: {} + uint8array-extras@1.5.0: {} - umzug@2.3.0: - dependencies: - bluebird: 3.7.2 + ultrahtml@1.6.0: {} - umzug@3.8.2(@types/node@22.9.0): + umzug@3.8.2(@types/node@24.7.2): dependencies: - '@rushstack/ts-command-line': 4.22.6(@types/node@22.9.0) + '@rushstack/ts-command-line': 4.23.7(@types/node@24.7.2) emittery: 0.13.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 pony-cause: 2.1.11 - type-fest: 4.25.0 + type-fest: 4.41.0 transitivePeerDependencies: - '@types/node' - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - uncrypto@0.1.3: {} - unctx@2.3.1(webpack-sources@3.2.3): + unctx@2.4.1: dependencies: - acorn: 8.14.0 + acorn: 8.15.0 estree-walker: 3.0.3 - magic-string: 0.30.12 - unplugin: 1.15.0(webpack-sources@3.2.3) - transitivePeerDependencies: - - webpack-sources + magic-string: 0.30.19 + unplugin: 2.3.10 - undefsafe@2.0.5: {} + undici-types@7.14.0: {} - undici-types@5.26.5: {} + undici@7.16.0: {} - undici-types@6.19.8: {} - - unenv@1.10.0: + unenv@2.0.0-rc.21: dependencies: - consola: 3.2.3 defu: 6.1.4 - mime: 3.0.0 - node-fetch-native: 1.6.4 - pathe: 1.1.2 + exsolve: 1.0.7 + ohash: 2.0.11 + pathe: 2.0.3 + ufo: 1.6.1 - unhead@1.11.11: + unhead@2.0.19: dependencies: - '@unhead/dom': 1.11.11 - '@unhead/schema': 1.11.11 - '@unhead/shared': 1.11.11 hookable: 5.5.3 - unicorn-magic@0.1.0: {} - unicorn-magic@0.3.0: {} - unimport@3.11.1(rollup@4.24.4): - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.4) - acorn: 8.12.1 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - fast-glob: 3.3.2 - local-pkg: 0.5.0 - magic-string: 0.30.11 - mlly: 1.7.1 - pathe: 1.1.2 - pkg-types: 1.2.0 - scule: 1.3.0 - strip-literal: 2.1.0 - unplugin: 1.12.2 - transitivePeerDependencies: - - rollup - - unimport@3.13.1(rollup@4.24.4)(webpack-sources@3.2.3): + unimport@5.4.1: dependencies: - '@rollup/pluginutils': 5.1.2(rollup@4.24.4) - acorn: 8.14.0 + acorn: 8.15.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - fast-glob: 3.3.2 - local-pkg: 0.5.0 - magic-string: 0.30.12 - mlly: 1.7.2 - pathe: 1.1.2 - pkg-types: 1.2.1 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + pathe: 2.0.3 + picomatch: 4.0.3 + pkg-types: 2.3.0 scule: 1.3.0 - strip-literal: 2.1.0 - unplugin: 1.15.0(webpack-sources@3.2.3) - transitivePeerDependencies: - - rollup - - webpack-sources + strip-literal: 3.1.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.1 unique-filename@3.0.0: dependencies: @@ -19783,129 +20372,123 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - universalify@0.1.2: {} - - universalify@0.2.0: {} - universalify@2.0.1: {} unpipe@1.0.0: {} - unplugin-vue-router@0.10.8(rollup@4.24.4)(vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3): + unplugin-utils@0.2.5: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-utils@0.3.1: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.3 + + unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.22)(typescript@5.9.3)(vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)))(vue@3.5.22(typescript@5.9.3)): dependencies: - '@babel/types': 7.26.0 - '@rollup/pluginutils': 5.1.3(rollup@4.24.4) - '@vue-macros/common': 1.12.2(rollup@4.24.4)(vue@3.5.12(typescript@5.6.3)) - ast-walker-scope: 0.6.2 - chokidar: 3.6.0 - fast-glob: 3.3.2 + '@vue-macros/common': 3.0.0-beta.16(vue@3.5.22(typescript@5.9.3)) + '@vue/compiler-sfc': 3.5.22 + '@vue/language-core': 3.1.1(typescript@5.9.3) + ast-walker-scope: 0.8.3 + chokidar: 4.0.3 json5: 2.2.3 - local-pkg: 0.5.0 - magic-string: 0.30.12 - mlly: 1.7.2 - pathe: 1.1.2 + local-pkg: 1.1.2 + magic-string: 0.30.19 + mlly: 1.8.0 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.3 scule: 1.3.0 - unplugin: 1.15.0(webpack-sources@3.2.3) - yaml: 2.5.0 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.2.5 + yaml: 2.8.1 optionalDependencies: - vue-router: 4.4.5(vue@3.5.12(typescript@5.6.3)) + vue-router: 4.5.1(vue@3.5.22(typescript@5.9.3)) transitivePeerDependencies: - - rollup + - typescript - vue - - webpack-sources - unplugin@1.12.2: + unplugin@2.3.10: dependencies: - acorn: 8.12.1 - chokidar: 3.6.0 - webpack-sources: 3.2.3 + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unplugin@1.15.0(webpack-sources@3.2.3): + unrs-resolver@1.11.1: dependencies: - acorn: 8.14.0 - webpack-virtual-modules: 0.6.2 + napi-postinstall: 0.3.4 optionalDependencies: - webpack-sources: 3.2.3 - - unstorage@1.13.1(ioredis@5.4.1): + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + + unstorage@1.17.1(db0@0.3.4(@libsql/client@0.15.15))(ioredis@5.8.1): dependencies: anymatch: 3.1.3 - chokidar: 3.6.0 - citty: 0.1.6 - destr: 2.0.3 - h3: 1.13.0 - listhen: 1.9.0 + chokidar: 4.0.3 + destr: 2.0.5 + h3: 1.15.4 lru-cache: 10.4.3 - node-fetch-native: 1.6.4 + node-fetch-native: 1.6.7 ofetch: 1.4.1 - ufo: 1.5.4 + ufo: 1.6.1 optionalDependencies: - ioredis: 5.4.1 - - untildify@5.0.0: {} + db0: 0.3.4(@libsql/client@0.15.15) + ioredis: 5.8.1 untun@0.1.3: dependencies: citty: 0.1.6 - consola: 3.2.3 + consola: 3.4.2 pathe: 1.1.2 - untyped@1.4.2: - dependencies: - '@babel/core': 7.25.2 - '@babel/standalone': 7.25.5 - '@babel/types': 7.25.4 - defu: 6.1.4 - jiti: 1.21.6 - mri: 1.2.0 - scule: 1.3.0 - transitivePeerDependencies: - - supports-color - - untyped@1.5.1: + untyped@2.0.0: dependencies: - '@babel/core': 7.26.0 - '@babel/standalone': 7.26.2 - '@babel/types': 7.26.0 + citty: 0.1.6 defu: 6.1.4 - jiti: 2.4.0 - mri: 1.2.0 + jiti: 2.6.1 + knitwork: 1.2.0 scule: 1.3.0 - transitivePeerDependencies: - - supports-color - unwasm@0.3.9(webpack-sources@3.2.3): + unwasm@0.3.11: dependencies: - knitwork: 1.1.0 - magic-string: 0.30.12 - mlly: 1.7.2 - pathe: 1.1.2 - pkg-types: 1.2.1 - unplugin: 1.15.0(webpack-sources@3.2.3) - transitivePeerDependencies: - - webpack-sources + knitwork: 1.2.0 + magic-string: 0.30.19 + mlly: 1.8.0 + pathe: 2.0.3 + pkg-types: 2.3.0 + unplugin: 2.3.10 upath@1.2.0: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): - dependencies: - browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 - - update-browserslist-db@1.1.1(browserslist@4.24.2): + update-browserslist-db@1.1.3(browserslist@4.26.3): dependencies: - browserslist: 4.24.2 + browserslist: 4.26.3 escalade: 3.2.0 - picocolors: 1.1.0 - - upper-case@1.1.3: {} + picocolors: 1.1.1 uqr@0.1.2: {} - uri-js-replace@1.0.1: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -19917,46 +20500,25 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - url@0.10.3: - dependencies: - punycode: 1.3.2 - querystring: 0.2.0 - - urlpattern-polyfill@8.0.2: {} - - user@0.0.0: {} - util-deprecate@1.0.2: {} - util-promisify@2.1.0: - dependencies: - object.getownpropertydescriptors: 2.1.8 - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - utils-merge@1.0.1: {} - uuid@10.0.0: {} - - uuid@8.0.0: {} - - uuid@8.3.2: {} + uuid@13.0.0: {} - uuid@9.0.1: {} - - v-clipboard@3.0.0-next.1(typescript@5.6.3): + v-clipboard@3.0.0-next.1(typescript@5.9.3): dependencies: - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - typescript - valid-data-url@3.0.1: {} + v8-compile-cache-lib@3.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 validate-npm-package-license@3.0.4: dependencies: @@ -19965,23 +20527,17 @@ snapshots: validate-npm-package-name@5.0.1: {} - validator@13.12.0: {} + validator@13.15.15: {} vary@1.1.2: {} - vee-validate@4.13.2(vue@3.5.12(typescript@5.6.3)): + vee-validate@4.15.1(vue@3.5.22(typescript@5.9.3)): dependencies: - '@vue/devtools-api': 6.6.4 - type-fest: 4.25.0 - vue: 3.5.12(typescript@5.6.3) - - vee-validate@4.14.6(vue@3.5.12(typescript@5.6.3)): - dependencies: - '@vue/devtools-api': 7.6.3 - type-fest: 4.25.0 - vue: 3.5.12(typescript@5.6.3) + '@vue/devtools-api': 7.7.7 + type-fest: 4.41.0 + vue: 3.5.22(typescript@5.9.3) - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -19989,20 +20545,28 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 + + vite-dev-rpc@1.1.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + birpc: 2.6.1 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) - vite-hot-client@0.2.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)): + vite-hot-client@2.1.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)): dependencies: - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) - vite-node@2.1.4(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0): + vite-node@3.2.4(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@9.4.0) - pathe: 1.1.2 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -20011,120 +20575,106 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml - vite-plugin-checker@0.7.2(eslint@9.14.0(jiti@2.4.0))(meow@10.1.5)(optionator@0.9.4)(typescript@5.6.3)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue-tsc@2.1.6(typescript@5.6.3)): + vite-plugin-checker@0.10.3(eslint@9.37.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)): dependencies: - '@babel/code-frame': 7.26.2 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - chokidar: 3.6.0 - commander: 8.3.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - npm-run-path: 4.0.1 - strip-ansi: 6.0.1 + '@babel/code-frame': 7.27.1 + chokidar: 4.0.3 + npm-run-path: 6.0.0 + picocolors: 1.1.1 + picomatch: 4.0.3 + strip-ansi: 7.1.2 tiny-invariant: 1.3.3 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vscode-languageclient: 7.0.0 - vscode-languageserver: 7.0.0 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 + tinyglobby: 0.2.15 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vscode-uri: 3.1.0 optionalDependencies: - eslint: 9.14.0(jiti@2.4.0) - meow: 10.1.5 + eslint: 9.37.0(jiti@2.6.1) optionator: 0.9.4 - typescript: 5.6.3 - vue-tsc: 2.1.6(typescript@5.6.3) - - vite-plugin-inspect@0.8.7(@nuxt/kit@3.13.0(magicast@0.3.4)(rollup@4.24.4)(webpack-sources@3.2.3))(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)): - dependencies: - '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.24.4) - debug: 4.3.7(supports-color@9.4.0) - error-stack-parser-es: 0.1.5 - fs-extra: 11.2.0 - open: 10.1.0 - perfect-debounce: 1.0.0 - picocolors: 1.0.1 - sirv: 2.0.4 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) + typescript: 5.9.3 + + vite-plugin-inspect@11.3.3(@nuxt/kit@3.19.3(magicast@0.3.5))(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + ansis: 4.2.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.1 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) optionalDependencies: - '@nuxt/kit': 3.13.0(magicast@0.3.4)(rollup@4.24.4)(webpack-sources@3.2.3) + '@nuxt/kit': 3.19.3(magicast@0.3.5) transitivePeerDependencies: - - rollup - supports-color - vite-plugin-inspect@0.8.7(@nuxt/kit@3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3))(rollup@4.24.4)(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)): + vite-plugin-vue-tracer@1.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)): dependencies: - '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.24.4) - debug: 4.3.7(supports-color@9.4.0) - error-stack-parser-es: 0.1.5 - fs-extra: 11.2.0 - open: 10.1.0 - perfect-debounce: 1.0.0 - picocolors: 1.0.1 - sirv: 2.0.4 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - optionalDependencies: - '@nuxt/kit': 3.14.159(magicast@0.3.5)(rollup@4.24.4)(webpack-sources@3.2.3) - transitivePeerDependencies: - - rollup - - supports-color - - vite-plugin-vue-inspector@5.1.3(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0)): - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) - '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2) - '@vue/compiler-dom': 3.4.38 - kolorist: 1.8.0 - magic-string: 0.30.11 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - transitivePeerDependencies: - - supports-color + estree-walker: 3.0.3 + exsolve: 1.0.7 + magic-string: 0.30.19 + pathe: 2.0.3 + source-map-js: 1.2.1 + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.22(typescript@5.9.3) - vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0): + vite@5.4.20(@types/node@24.7.2)(sass@1.93.2)(terser@5.44.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.24.4 + postcss: 8.5.6 + rollup: 4.52.4 optionalDependencies: - '@types/node': 22.9.0 + '@types/node': 24.7.2 fsevents: 2.3.3 - sass: 1.79.5 - terser: 5.36.0 + sass: 1.93.2 + terser: 5.44.0 - vitepress@1.5.0(@algolia/client-search@4.24.0)(@types/node@22.9.0)(axios@1.7.7)(change-case@5.4.4)(postcss@8.4.47)(sass@1.79.5)(search-insights@2.17.0)(sortablejs@1.14.0)(terser@5.36.0)(typescript@5.6.3): + vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: - '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(search-insights@2.17.0) - '@iconify-json/simple-icons': 1.2.11 - '@shikijs/core': 1.22.2 - '@shikijs/transformers': 1.22.2 - '@shikijs/types': 1.22.2 + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.4 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.7.2 + fsevents: 2.3.3 + jiti: 2.6.1 + sass: 1.93.2 + terser: 5.44.0 + yaml: 2.8.1 + + vitepress@1.6.4(@algolia/client-search@5.40.0)(@types/node@24.7.2)(axios@1.12.2)(change-case@5.4.4)(fuse.js@7.1.0)(postcss@8.5.6)(sass@1.93.2)(search-insights@2.17.3)(sortablejs@1.14.0)(terser@5.44.0)(typescript@5.9.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.40.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.54 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.4(vite@5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - '@vue/devtools-api': 7.6.3 - '@vue/shared': 3.5.12 - '@vueuse/core': 11.1.0(vue@3.5.12(typescript@5.6.3)) - '@vueuse/integrations': 11.1.0(axios@1.7.7)(change-case@5.4.4)(focus-trap@7.6.0)(sortablejs@1.14.0)(vue@3.5.12(typescript@5.6.3)) - focus-trap: 7.6.0 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.20(@types/node@24.7.2)(sass@1.93.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3)) + '@vue/devtools-api': 7.7.7 + '@vue/shared': 3.5.22 + '@vueuse/core': 12.8.2(typescript@5.9.3) + '@vueuse/integrations': 12.8.2(axios@1.12.2)(change-case@5.4.4)(focus-trap@7.6.5)(fuse.js@7.1.0)(sortablejs@1.14.0)(typescript@5.9.3) + focus-trap: 7.6.5 mark.js: 8.11.1 - minisearch: 7.1.0 - shiki: 1.22.2 - vite: 5.4.10(@types/node@22.9.0)(sass@1.79.5)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.20(@types/node@24.7.2)(sass@1.93.2)(terser@5.44.0) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - postcss: 8.4.47 + postcss: 8.5.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' - '@types/react' - - '@vue/composition-api' - async-validator - axios - change-case @@ -20148,96 +20698,61 @@ snapshots: - typescript - universal-cookie - vscode-jsonrpc@6.0.0: {} - - vscode-languageclient@7.0.0: - dependencies: - minimatch: 3.1.2 - semver: 7.6.3 - vscode-languageserver-protocol: 3.16.0 - - vscode-languageserver-protocol@3.16.0: - dependencies: - vscode-jsonrpc: 6.0.0 - vscode-languageserver-types: 3.16.0 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.16.0: {} - - vscode-languageserver@7.0.0: - dependencies: - vscode-languageserver-protocol: 3.16.0 - - vscode-uri@3.0.8: {} - - vue-bundle-renderer@2.1.1: - dependencies: - ufo: 1.5.4 + vscode-uri@3.1.0: {} - vue-demi@0.14.10(vue@3.5.12(typescript@5.6.3)): + vue-bundle-renderer@2.2.0: dependencies: - vue: 3.5.12(typescript@5.6.3) + ufo: 1.6.1 vue-devtools-stub@0.1.0: {} - vue-eslint-parser@9.4.3(eslint@9.14.0(jiti@2.4.0)): + vue-eslint-parser@10.2.0(eslint@9.37.0(jiti@2.6.1)): dependencies: - debug: 4.3.7(supports-color@9.4.0) - eslint: 9.14.0(jiti@2.4.0) - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + debug: 4.4.3 + eslint: 9.37.0(jiti@2.6.1) + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 - lodash: 4.17.21 - semver: 7.6.3 + semver: 7.7.3 transitivePeerDependencies: - supports-color - vue-router@4.4.5(vue@3.5.12(typescript@5.6.3)): + vue-router@4.5.1(vue@3.5.22(typescript@5.9.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.12(typescript@5.6.3) - - vue-tsc@2.1.6(typescript@5.6.3): - dependencies: - '@volar/typescript': 2.4.6 - '@vue/language-core': 2.1.6(typescript@5.6.3) - semver: 7.6.3 - typescript: 5.6.3 - optional: true + vue: 3.5.22(typescript@5.9.3) - vue3-tree-vue@2.0.11(vue@3.5.12(typescript@5.6.3)): + vue3-tree-vue@2.0.15(vue@3.5.22(typescript@5.9.3)): dependencies: - user: 0.0.0 - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.22(typescript@5.9.3) - vue@3.5.12(typescript@5.6.3): + vue@3.5.22(typescript@5.9.3): dependencies: - '@vue/compiler-dom': 3.5.12 - '@vue/compiler-sfc': 3.5.12 - '@vue/runtime-dom': 3.5.12 - '@vue/server-renderer': 3.5.12(vue@3.5.12(typescript@5.6.3)) - '@vue/shared': 3.5.12 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 - vuedraggable@4.1.0(vue@3.5.12(typescript@5.6.3)): + vuedraggable@4.1.0(vue@3.5.22(typescript@5.9.3)): dependencies: sortablejs: 1.14.0 - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.22(typescript@5.9.3) - vuetify@3.7.0(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)): + vuetify@3.10.5(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)): dependencies: - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 - vuetify@3.7.4(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)): + vuetify@3.7.0(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3)): dependencies: - vue: 3.5.12(typescript@5.6.3) + vue: 3.5.22(typescript@5.9.3) optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 w3c-keyname@2.2.8: {} @@ -20247,95 +20762,99 @@ snapshots: walk-up-path@3.0.1: {} - wcwidth@1.0.1: + walker@1.0.8: dependencies: - defaults: 1.0.4 + makeerror: 1.0.12 - web-resource-inliner@6.0.1(encoding@0.1.13): + watchpack@2.4.4: dependencies: - ansi-colors: 4.1.3 - escape-goat: 3.0.0 - htmlparser2: 5.0.1 - mime: 2.6.0 - node-fetch: 2.7.0(encoding@0.1.13) - valid-data-url: 3.0.1 - transitivePeerDependencies: - - encoding + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 - web-streams-polyfill@4.0.0-beta.3: {} + web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} + webidl-conversions@8.0.0: {} - webpack-sources@3.2.3: {} + webpack-node-externals@3.0.0: {} + + webpack-sources@3.3.3: {} webpack-virtual-modules@0.6.2: {} + webpack@5.100.2: + 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.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.26.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.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.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(webpack@5.100.2) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 whatwg-mimetype@4.0.0: {} - whatwg-url@14.0.0: + whatwg-url@15.1.0: dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 + tr46: 6.0.0 + webidl-conversions: 8.0.0 whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-module@2.0.1: {} - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - which@2.0.2: dependencies: isexe: 2.0.0 - which@3.0.1: - dependencies: - isexe: 2.0.0 - which@4.0.0: dependencies: isexe: 3.1.1 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - - widest-line@4.0.1: + which@5.0.0: dependencies: - string-width: 5.1.2 + isexe: 3.1.1 widest-line@5.0.0: dependencies: string-width: 7.2.0 - wkx@0.5.0: - dependencies: - '@types/node': 22.9.0 - word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -20350,15 +20869,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 - wrap-ansi@9.0.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -20367,72 +20886,36 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.0: {} + ws@8.18.3: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 xml-name-validator@4.0.0: {} xml-name-validator@5.0.0: {} - xml2js@0.6.2: - dependencies: - sax: 1.2.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - xmlchars@2.2.0: {} xtend@4.0.2: {} - y18n@4.0.3: {} - y18n@5.0.8: {} yallist@3.1.1: {} yallist@4.0.0: {} - yaml-ast-parser@0.0.43: {} - - yaml@2.5.0: {} - - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 + yallist@5.0.0: {} - yargs-parser@20.2.9: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -20444,31 +20927,44 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - yn@5.0.0: {} + yn@3.1.1: {} + + yn@5.1.0: {} yocto-queue@0.1.0: {} - yocto-queue@1.1.1: {} + yocto-queue@1.2.1: {} + + yoctocolors-cjs@2.1.3: {} - yoctocolors-cjs@2.1.2: {} + yoctocolors@2.1.2: {} - yoctocolors@2.1.1: {} + yoctodelay@2.0.0: {} - yoctodelay@1.2.0: {} + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.11: + dependencies: + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 - yup@1.4.0: + yup@1.7.1: dependencies: property-expr: 2.0.6 tiny-case: 1.0.3 toposort: 2.0.2 type-fest: 2.19.0 - zhead@2.2.4: {} - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 - readable-stream: 4.5.2 + readable-stream: 4.7.0 zwitch@2.0.4: {} diff --git a/scripts/boot.js b/scripts/boot.js index 1b1f035..973bc5d 100644 --- a/scripts/boot.js +++ b/scripts/boot.js @@ -65,7 +65,7 @@ const dbConfig = env.DATABASE_URI : { host: env.DATABASE_HOST || 'localhost', port: env.DATABASE_PORT || 5432, - user: env.DATABASE_USER, + user: env.DATABASE_USERNAME, password: env.DATABASE_PASSWORD, database: env.DATABASE_NAME, }; @@ -73,7 +73,14 @@ await testDatabaseConnection(dbConfig, 10, 3000); dbConnectionLoader.stop(); const appCommands = await Promise.all( - ['backend', 'frontend'].map(async (name, index) => { + ['backend', 'frontend', 'api-client'].map(async (name, index) => { + if (name === 'api-client') { + return { + name, + prefixColor: 'yellow', + command: `pnpm api:client:watch`, + }; + } return { name, prefixColor: ['blue', 'green'][index], diff --git a/scripts/setup/set-env.js b/scripts/setup/set-env.js index fc78ce4..3275610 100644 --- a/scripts/setup/set-env.js +++ b/scripts/setup/set-env.js @@ -21,7 +21,6 @@ const setAppEnv = (opts) => ({ DATABASE_NAME: opts.dbName, DATABASE_USER: opts.user, DATABASE_PASSWORD: opts.password, - STORAGE_PATH: `${PROJECT_DIR}/apps/backend/data`, }; return { env, @@ -34,7 +33,7 @@ export default async function ({ dbPrefix }) { try { const dbConfig = await getDatabaseClient(); const configs = [ - setAppEnv({ ...dbConfig, dbName: getDBName('app_starter', dbPrefix) }), + setAppEnv({ ...dbConfig, dbName: getDBName('odma', dbPrefix) }), ]; const afterHooks = []; await Promise.all( diff --git a/tests/api/BaseClient.ts b/tests/api/BaseClient.ts index b3ccddc..d3073e0 100644 --- a/tests/api/BaseClient.ts +++ b/tests/api/BaseClient.ts @@ -25,9 +25,18 @@ export default class BaseClient { private signIn = async () => { const { email, password } = TEST_USER; BaseClient.req = await Playwright.request.newContext(); - await BaseClient.req.post(new URL('/api/users/login', this.baseURL).href, { - headers: { 'Content-Type': 'application/json' }, - data: { email, password }, - }); + const response = await BaseClient.req.post( + new URL('/api/auth/login', this.baseURL).href, + { + headers: { 'Content-Type': 'application/json' }, + data: { email, password }, + }, + ); + if (!response.ok()) { + const responseText = await response.text(); + throw new Error( + `Authentication failed: ${response.status()} ${responseText}`, + ); + } }; } diff --git a/tests/package.json b/tests/package.json index 2c2f216..8a913a4 100644 --- a/tests/package.json +++ b/tests/package.json @@ -8,19 +8,19 @@ "e2e:a11y": "pnpm playwright test --project=a11y --project=setup" }, "devDependencies": { - "@axe-core/playwright": "4.10.0", - "@percy/cli": "^1.30.1", - "@percy/playwright": "^1.0.6", - "@playwright/test": "1.46.1", - "@types/node": "^22.9.0" + "@axe-core/playwright": "4.10.2", + "@percy/cli": "^1.31.3", + "@percy/playwright": "^1.0.9", + "@playwright/test": "1.56.0", + "@types/node": "^24.7.2" }, "dependencies": { - "@faker-js/faker": "^8.4.1", - "date-fns": "^3.6.0", - "dotenv": "^16.4.5", - "jsdom": "^24.1.0", + "@faker-js/faker": "^10.0.0", + "date-fns": "^4.1.0", + "dotenv": "^17.2.3", + "jsdom": "^27.0.0", "lodash": "^4.17.21", - "mailtrap": "^3.4.0", + "mailtrap": "^4.3.0", "@app/seed": "workspace:^" } } diff --git a/tests/playwright.config.ts b/tests/playwright.config.ts index 62893d4..410a24e 100644 --- a/tests/playwright.config.ts +++ b/tests/playwright.config.ts @@ -3,7 +3,7 @@ import { defineConfig, devices } from '@playwright/test'; dotenv.config(); -if (!process.env.APP_URL) process.env.APP_URL = 'http://localhost:3001'; +if (!process.env.APP_URL) process.env.APP_URL = 'http://localhost:3000'; // See https://playwright.dev/docs/test-configuration. export default defineConfig({ diff --git a/tests/pom/admin/UserManagement.ts b/tests/pom/admin/UserManagement.ts index 1f68466..0dc96fc 100644 --- a/tests/pom/admin/UserManagement.ts +++ b/tests/pom/admin/UserManagement.ts @@ -160,6 +160,7 @@ export class UserManagement { lastName: string = 'Doe', role: 'Admin' | 'User' = 'Admin', ) { + await this.el.waitFor({ state: 'visible' }); await this.addBtn.click(); const dialog = new UserDialog(this.page); await dialog.edit(email, firstName, lastName, role); diff --git a/tests/pom/auth/ForgotPassword.ts b/tests/pom/auth/ForgotPassword.ts index 9beb622..f237a6d 100644 --- a/tests/pom/auth/ForgotPassword.ts +++ b/tests/pom/auth/ForgotPassword.ts @@ -29,7 +29,7 @@ export class ForgotPassword { } async fetchResetLink(email: string) { - const linkTitle = 'Reset password'; + const linkTitle = 'Reset Password'; const resetLink = await getAnchorFromLastRecievedEmail(email, linkTitle); expect(resetLink.textContent).toBe(linkTitle); return resetLink.href; diff --git a/tests/pom/auth/ResetPassword.ts b/tests/pom/auth/ResetPassword.ts index a0ae031..10c7324 100644 --- a/tests/pom/auth/ResetPassword.ts +++ b/tests/pom/auth/ResetPassword.ts @@ -26,13 +26,14 @@ export class ResetPassword { } async resetPassword(password: string) { + await expect(this.passwordInput).toBeVisible(); await this.fillPassword(password); await this.fillPasswordConfirmation(password); await this.submitBtn.click(); } async fetchInviteLink(email: string) { - const linkTitle = 'Complete registration'; + const linkTitle = 'Set Up Account'; const resetLink = await getAnchorFromLastRecievedEmail(email, linkTitle); expect(resetLink.textContent).toBe(linkTitle); return resetLink.href; diff --git a/tests/pom/common/AppBar.ts b/tests/pom/common/AppBar.ts index 95fc834..3a5df37 100644 --- a/tests/pom/common/AppBar.ts +++ b/tests/pom/common/AppBar.ts @@ -4,13 +4,13 @@ export class AppBar { readonly page: Page; readonly el: Locator; readonly adminLink: Locator; - readonly catalogLink: Locator; + readonly homeLink: Locator; readonly userMenu: Locator; constructor(page: Page) { this.page = page; this.el = page.locator('#mainAppBar'); - this.catalogLink = this.el.getByRole('link', { name: 'Catalog' }); + this.homeLink = this.el.getByRole('link', { name: 'Home' }); this.adminLink = this.el.getByRole('link', { name: 'Admin' }); this.userMenu = this.el.getByLabel('User menu'); } diff --git a/tests/specs/functional/admin/user-management.spec.ts b/tests/specs/functional/admin/user-management.spec.ts index 2a29fe7..7a7889c 100644 --- a/tests/specs/functional/admin/user-management.spec.ts +++ b/tests/specs/functional/admin/user-management.spec.ts @@ -7,12 +7,20 @@ import { UserManagement, } from '../../../pom/admin/UserManagement.ts'; import SeedClient from '../../../api/SeedClient.ts'; +import { SignIn } from '../../../pom/auth/index.ts'; +import { TEST_USER } from '../../../fixtures/auth.ts'; const DEFAULT_USERS_PER_PAGE = 10; test.beforeEach(async ({ page }) => { await SeedClient.resetDatabase(); + // Re-authenticate after database reset + const authPage = new SignIn(page); + await authPage.visit(); + await authPage.signIn(TEST_USER.email, TEST_USER.password); + await page.waitForLoadState('networkidle'); await page.goto(UserManagement.route); + await page.waitForLoadState('networkidle'); }); test('should be able to add new user to the platform', async ({ page }) => { diff --git a/tests/specs/functional/auth/auth.spec.ts b/tests/specs/functional/auth/auth.spec.ts index fd10fe5..46ead39 100644 --- a/tests/specs/functional/auth/auth.spec.ts +++ b/tests/specs/functional/auth/auth.spec.ts @@ -6,16 +6,24 @@ import ApiClient from '../../../api/ApiClient'; import { AppBar } from '../../../pom/common/AppBar'; import { TEST_USER as DEFAULT_USER } from '../../../fixtures/auth'; -const { OIDC_TEST_USER_EMAIL, OIDC_TEST_USER_PASSWORD } = process.env; +const { + OIDC_TEST_USER_EMAIL: _OIDC_TEST_USER_EMAIL, + OIDC_TEST_USER_PASSWORD: _OIDC_TEST_USER_PASSWORD, +} = process.env; interface UserData { email: string; - password: string; + firstName?: string; + lastName?: string; + role: string; + password?: string; } const getMockUserData = (): UserData => ({ email: faker.internet.email({ provider: 'example.com' }), - password: faker.internet.password(), + firstName: faker.person.firstName(), + lastName: faker.person.lastName(), + role: 'ADMIN', }); const userAPI = new ApiClient('/api/users'); @@ -27,9 +35,11 @@ const createUser = async (page): Promise => { const resetPasswordPage = new ResetPassword(page); const inviteLink = await resetPasswordPage.fetchInviteLink(userData.email); await page.goto(inviteLink); - await resetPasswordPage.resetPassword(userData.password); + await page.waitForLoadState('networkidle'); + const password = 'Test1234!'; + await resetPasswordPage.resetPassword(password); await page.goto(initialLocation); - return userData; + return { ...userData, password }; }; test.beforeEach(async ({ page }) => { @@ -43,29 +53,18 @@ test('sign in page has a title set', async ({ page }) => { await expect(page).toHaveTitle(/Sign in/); }); -test('should be able to sign in with OIDC', async ({ page }) => { - test.skip( - !OIDC_TEST_USER_EMAIL || !OIDC_TEST_USER_PASSWORD, - 'OIDC is not enabled', - ); - const signInPage = new SignIn(page); - await signInPage.visit(); - await signInPage.oidcSignIn(OIDC_TEST_USER_EMAIL, OIDC_TEST_USER_PASSWORD); - await expect(page).toHaveTitle('Catalog'); -}); - test('should be able to sign in', async ({ page }) => { const signInPage = new SignIn(page); await signInPage.visit(); await signInPage.signIn(DEFAULT_USER.email, DEFAULT_USER.password); - await expect(page).toHaveTitle('Catalog'); + await expect(page).toHaveTitle('Home'); }); test('should be able to sign out', async ({ page }) => { const signInPage = new SignIn(page); await signInPage.visit(); await signInPage.signIn(DEFAULT_USER.email, DEFAULT_USER.password); - await expect(page).toHaveTitle('Catalog'); + await expect(page).toHaveTitle('Home'); const appBar = new AppBar(page); await appBar.logout(); await expect(page).toHaveTitle(/Sign in/); @@ -74,7 +73,7 @@ test('should be able to sign out', async ({ page }) => { test('sign in should fail in case of wrong credentials', async ({ page }) => { const signInPage = new SignIn(page); await signInPage.visit(); - await signInPage.signIn(DEFAULT_USER.email, faker.internet.password()); + await signInPage.signIn(DEFAULT_USER.email, 'Test1234!'); await expect( page.getByText('The email or password you entered is incorrect.'), ).toBeVisible(); @@ -101,15 +100,11 @@ test('should be able to reset password', async ({ page }) => { // Fetch reset link from email const resetLink = await forgotPasswordPage.fetchResetLink(user.email); await page.goto(resetLink); + await page.waitForLoadState('networkidle'); // Set new password const resetPasswordPage = new ResetPassword(page); - const newPassword = faker.internet.password(); + const newPassword = 'Test1234!'; await resetPasswordPage.resetPassword(newPassword); await signInPage.signIn(user.email, newPassword); - await expect(page).toHaveTitle('Catalog'); -}); - -test.afterAll(async () => { - // Delete all newly created users - await userAPI.dispose(); + await expect(page).toHaveTitle('Home'); }); diff --git a/tests/specs/functional/common/top-navigation.spec.ts b/tests/specs/functional/common/top-navigation.spec.ts index 89e29d4..814d885 100644 --- a/tests/specs/functional/common/top-navigation.spec.ts +++ b/tests/specs/functional/common/top-navigation.spec.ts @@ -1,10 +1,17 @@ import { expect, test } from '@playwright/test'; import { AppBar } from '../../../pom/common/AppBar.ts'; import SeedClient from '../../../api/SeedClient.ts'; +import { SignIn } from '../../../pom/auth/SignIn.ts'; +import { TEST_USER } from '../../../fixtures/auth.ts'; test.beforeEach(async ({ page }) => { await SeedClient.resetDatabase(); + const authPage = new SignIn(page); + await authPage.visit(); + await authPage.signIn(TEST_USER.email, TEST_USER.password); + await page.waitForLoadState('networkidle'); await page.goto('/'); + await page.waitForLoadState('networkidle'); }); test('should be able to access admin page', async ({ page }) => { @@ -14,13 +21,12 @@ test('should be able to access admin page', async ({ page }) => { await expect(page.getByText('System users')).toBeVisible(); }); -test('should be able to navigate to the catalog page', async ({ page }) => { +test('should be able to navigate to the home page', async ({ page }) => { const appBar = new AppBar(page); await appBar.adminLink.click(); await expect(page.getByText('System users')).toBeVisible(); - await appBar.catalogLink.click(); - await expect(page).toHaveTitle('Catalog'); - await expect(page.getByText('0 available repositories')).toBeVisible(); + await appBar.homeLink.click(); + await expect(page).toHaveTitle('Home'); }); test.afterAll(async () => { diff --git a/tests/specs/functional/common/user-profile.spec.ts b/tests/specs/functional/common/user-profile.spec.ts index 4e5a6a8..192e6bf 100644 --- a/tests/specs/functional/common/user-profile.spec.ts +++ b/tests/specs/functional/common/user-profile.spec.ts @@ -4,6 +4,8 @@ import userSeed from '@app/seed/user.json'; import { ChangePasswordDialog } from '../../../pom/common/ChangePasswordDiaog'; import SeedClient from '../../../api/SeedClient'; +import { SignIn } from '../../../pom/auth/index.ts'; +import { TEST_USER } from '../../../fixtures/auth.ts'; import { UserProfile } from '../../../pom/common/UserProfile'; interface UserData { @@ -12,15 +14,21 @@ interface UserData { lastName: string; } -const getMockUserData = (): UserData => ({ - email: faker.internet.email({ provider: 'example.com' }).toLowerCase(), +const getTestUserData = (): UserData => ({ + email: TEST_USER.email, firstName: faker.person.firstName(), lastName: faker.person.lastName(), }); test.beforeEach(async ({ page }) => { await SeedClient.resetDatabase(); + // Re-authenticate after database reset + const authPage = new SignIn(page); + await authPage.visit(); + await authPage.signIn(TEST_USER.email, TEST_USER.password); + await page.waitForLoadState('networkidle'); await page.goto(UserProfile.route); + await page.waitForLoadState('networkidle'); }); test('should be able to access profile page', async ({ page }) => { @@ -29,7 +37,7 @@ test('should be able to access profile page', async ({ page }) => { test('should be able to update user', async ({ page }) => { const profilePage = new UserProfile(page); - const { email, firstName, lastName } = getMockUserData(); + const { email, firstName, lastName } = getTestUserData(); await profilePage.updateProfile(email, firstName, lastName); await profilePage.hasVisibleStatusMessage('User information updated!'); await page.reload(); @@ -41,7 +49,7 @@ test('should be able to update user', async ({ page }) => { test('updating user should fail if email already exists', async ({ page }) => { const { data: user } = await SeedClient.seedUser(); const email = user.email.toLowerCase(); - const { firstName, lastName } = getMockUserData(); + const { firstName, lastName } = getTestUserData(); const profilePage = new UserProfile(page); await profilePage.updateProfile(email, firstName, lastName); await profilePage.hasVisibleAlert('Email is already taken'); @@ -121,7 +129,7 @@ test('updating password should fail if password confirmation does not match', as const passwordDialog = new ChangePasswordDialog(page); await passwordDialog.open(); await passwordDialog.fillCurrentPassword(userSeed[0].password); - await passwordDialog.fillNewPassword(faker.internet.password()); + await passwordDialog.fillNewPassword('Test1234!'); await passwordDialog.fillPasswordConfirmation(faker.internet.password()); await passwordDialog.save(); await passwordDialog.hasVisibleAlert('Password confirmation does not match'); @@ -133,7 +141,7 @@ test('updating password should fail if current password is incorrect', async ({ const passwordDialog = new ChangePasswordDialog(page); await passwordDialog.open(); await passwordDialog.fillCurrentPassword(faker.internet.password()); - const newPassword = faker.internet.password(); + const newPassword = 'Test1234!'; await passwordDialog.fillNewPassword(newPassword); await passwordDialog.fillPasswordConfirmation(newPassword); await passwordDialog.save(); @@ -144,10 +152,11 @@ test('should be able to update password', async ({ page }) => { const passwordDialog = new ChangePasswordDialog(page); await passwordDialog.open(); await passwordDialog.fillCurrentPassword(userSeed[0].password); - const newPassword = faker.internet.password(); + const newPassword = 'Test1234!'; await passwordDialog.fillNewPassword(newPassword); await passwordDialog.fillPasswordConfirmation(newPassword); await passwordDialog.save(); + await page.waitForLoadState('networkidle'); await expect(page).toHaveTitle('Sign in'); }); diff --git a/tests/specs/setup.spec.ts b/tests/specs/setup.spec.ts index 959af9f..e44179e 100644 --- a/tests/specs/setup.spec.ts +++ b/tests/specs/setup.spec.ts @@ -8,6 +8,6 @@ setup('authenticate', async ({ page }) => { await authPage.visit(); await authPage.signIn(TEST_USER.email, TEST_USER.password); await page.waitForLoadState('networkidle'); - await expect(page).toHaveTitle(/Catalog/); + await expect(page).toHaveTitle(/Home/); await page.context().storageState({ path: '.auth.json' }); });